【发布时间】:2020-03-03 07:14:14
【问题描述】:
在 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);
任何具体原因,还是编译器错误?
相关: What is the return type of sizeof operator?
编辑,有趣的是,这些也可以正常工作:
HANDLE events[2];
constexpr size_t s1 = sizeof(Events) / sizeof(Events[0]);
constexpr size_t s2 = std::size(Events);
变量s1 和s2 被视为真正的编译时值,而不是std::size() 的结果本身!
【问题讨论】:
-
"变量 s1 和 s2 被视为真正的编译时值,而不是 std::size() 的结果本身!" 什么是“真正的编译” -time 值,
std::size()与此有何不同? -
@NicolBolas A
constexpr函数可能不会导致编译时常量 -
是的,
constexpr函数可以在运行时执行。但这并没有回答我的问题:您认为什么是“真正的编译时价值”?
标签: c++ visual-c++ c++14 visual-c++-2019