【问题标题】:Is direct initialization forbidden for array?数组是否禁止直接初始化?
【发布时间】:2014-06-30 22:58:46
【问题描述】:

Language-lawyer-wise,标准中的哪个条款禁止以下代码:

int arr[] (10, 42); 

这将产生一个包含 10 个元素的数组,每个元素都初始化为 42。

【问题讨论】:

  • int arr[10]; std::fill_n(arr, 10, 42);
  • 对于内置数组的实际初始化,您将获得的最佳效果可能是int arr_0[] = {MAGIC_REPEAT_MACRO(10, 42)};。 IIRC,BOOST_PP_REPEAT 将允许这样做。骗子真的不包括 C++ AFAICT 中的初始化。
  • 使用constexpr,开心:)。编写一个构建数组的constexpr 函数,从初始化程序中调用它。
  • @user3791991:你为什么认为(10, 42) 的意思是“产生10 个元素,每个元素初始化为42”?没有编译器会将第一个值视为计数,将下一个值视为初始值设定项。 std::vector 具有接受此类值的构造函数,例如 std::vector<int> arr(10, 42);,但普通数组没有。
  • @RemyLebeau,如果假设的原因是这些内置类型“缺少构造函数”,那么为什么int num(10); 会起作用?这看起来也像是一个构造函数调用。

标签: c++ arrays initialization language-lawyer


【解决方案1】:

语言律师,8.5/17:

——如果初始化器是一个(无括号的)大括号初始化列表,则对象或引用是列表初始化的(8.5.4)。

——如果目标类型是引用类型,见 8.5.3。

- 如果目标类型是字符数组、char16_t 数组、char32_t 数组或 wchar_t 数组,初始值设定项是字符串字面量,见 8.5.2。

——如果初始化器是(),则对象是值初始化的。

——否则,如果目标类型是数组,则程序是非良构的

花括号初始化列表是 { },其中任何东西(或什么都没有)都可以放在括号内(例如,int arr[3] = {1,2,3})。考虑到这一点,前 4 个选项都不适用于 int arr[] (10, 42);,最后一个选项表明程序格式错误。

【讨论】:

  • 第4种情况,()是否表示括号内不能有表达式?
  • @user3791991 没错,但值得注意的是空格可以在括号内
  • @Falias,那么,为什么下面的语句将目标类型初始化为 1(已验证)? int num();
  • @user3791991 这被解析为函数声明,不涉及初始化。
【解决方案2】:

8.5/14:

如果被初始化的实体没有类类型,则带括号的初始化器中的表达式列表应为单个表达式。

【讨论】:

  • 我认为这不适用于int arr[](expression); 无论如何都是不允许的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多