В Visual C ++ 2019:
Следующий код выводит предупреждение:
warning C4267: 'argument': conversion from 'size_t' to 'DWORD', possible loss of data
HANDLE events[2];
WaitForMultipleObjects(std::size(events), events, FALSE, INFINITE);
Но использование _countof(events)
не даст никакого предупреждения , Обратите внимание, что вызывается функция перегрузки шаблона std::size
. Вот это:
template<class _Ty,
size_t _Size> inline
constexpr size_t size(const _Ty(&)[_Size]) _NOEXCEPT
{ // get dimension for array
return (_Size);
}
Что по сути равно , возвращая size_t
, а функция - constexpr
. И вот почему объявление массива работает:
HANDLE Events[2];
int arr[std::size(Events)];
Но следующий код не будет скомпилирован без предупреждения:
DWORD sz1 = std::size(Events);
Это нормально:
DWORD sz2= _countof(Events);
Любые параметры c причина или ошибка компилятора?
Соответствующий: Какой тип возврата у оператора sizeof?
EDIT , Интересно, что они также будут работать нормально:
HANDLE events[2];
constexpr size_t s1 = sizeof(Events) / sizeof(Events[0]);
constexpr size_t s2 = std::size(Events);
Переменные s1
и s2
принимаются как истинные значения времени компиляции, но не сам результат std::size()
!