将 int 转换为 size_t

2024-04-15

当我传递一个时,我想知道 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_tbut 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(使用前将#替换为@)

将 int 转换为 size_t 的相关文章

随机推荐