在 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);
}
本质上是返回 a size_t
,而函数是constexpr
. 这就是数组声明有效的原因:
HANDLE Events[2];
int arr[std::size(Events)];
但以下代码不会在没有警告的情况下编译:
DWORD sz1 = std::size(Events);
这没关系:
DWORD sz2= _countof(Events);
有什么具体原因,还是编译器错误?
编辑,有趣的是,这些也可以正常工作:
HANDLE events[2];
constexpr size_t s1 = sizeof(Events) / sizeof(Events[0]);
constexpr size_t s2 = std::size(Events);
变量s1
和s2
被视为真正的编译时值,而不是std::size()
结果本身!