当我传递一个时,我想知道 clang 编译器的以下警告integer
to an std::initializer_list< size_t >
:
non-constant-expression cannot be narrowed from type 'int' to 'unsigned long' in initializer list
Why can int
被投射到size_t
but an int
不被传递给std::initializer_list< size_t >
, i.e.
int main()
{
size_t s_t = 0;
int i = 0;
std::initializer_list<size_t> i_l = { i }; // warning
s_t = i; // no warning
return 0;
}
来自[dcl.init.list]:
A 缩小转换范围是隐式转换 [...] — 从整数类型或无作用域枚举类型到不能表示原始类型的所有值的整数类型,除非源是常量表达式,其整型提升后的值将适合目标类型。
我们正在转换自int
(允许负值)size_t
(事实并非如此),所以这是一个缩小转换。缩小转换在列表初始化中格式不正确,这就是您在这里所做的:
std::initializer_list<size_t> i_l = { i };
然而,缩小转换在其他地方是没问题的(就标准而言):
s_t = i;
这就是为什么第一行格式错误但第二行则不然。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)