Статический анализатор 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;
}