Тип sizeof
От: _NN_ www.nemerleweb.com
Дата: 09.03.20 13:00
Оценка:
Статический анализатор MSVC ругается на две последние функции но не ругается на предыдущие.
Очевидно правила типов работают немного по другому во времени компиляции.
Это правильно по стандарту ?

#include <algorithm>
#include <type_traits>

static_assert(std::is_same_v< decltype(sizeof(1)), size_t >);
static_assert(std::is_same_v< decltype(static_cast<unsigned short>(1) + sizeof(1)), size_t >);

int f_countof(unsigned short i)
{
    int l[5] = { 1,2,3,4,5 };
    unsigned short j = i + sizeof(l) / sizeof(l[0]); //

    return j;
}

int f_countof_with_cast(unsigned short i)
{
    int l[5] = { 1,2,3,4,5 };
    unsigned short j = i + static_cast<size_t>(sizeof(l) / sizeof(l[0]));

    return j;
}


int f_countof_with_constexpr(unsigned short i)
{
    int l[5] = { 1,2,3,4,5 };
    constexpr size_t q = static_cast<size_t>(sizeof(l) / sizeof(l[0]));
    unsigned short j = i + q;

    return j;
}

int f_countof_with_const(unsigned short i)
{
    int l[5] = { 1,2,3,4,5 };
    const size_t q = static_cast<size_t>(sizeof(l) / sizeof(l[0]));
    unsigned short j = i + q;

    return j;
}

int f_countof_with_var(unsigned short i)
{
    int l[5] = { 1,2,3,4,5 };
    size_t q = static_cast<size_t>(sizeof(l) / sizeof(l[0]));
    unsigned short j = i + q; // warning C4267: 'initializing': conversion from 'size_t' to 'unsigned short', possible loss of data

    return j;
}

int f_std_size(unsigned short i)
{
    int l[5] = { 1,2,3,4,5 };
    unsigned short j = i + std::size(l); // warning C4267: 'initializing': conversion from 'size_t' to 'unsigned short', possible loss of data

    return j;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.