为什么我们只能使用初始化列表来初始化数组

3
在以下示例中:
#include <iostream>

int a[][2] = {{1, 4}, {2, 6}};
int b[][3] = a; // error: array initializer must be an initializer list

演示

为什么我们不能用任何方式初始化数组而必须使用初始化列表?我试着在N4296::8.5.4 [dcl.init.list]中查找,但好像没有合适的内容。


4
“为什么”指“为什么要这样规定”,或者“标准在哪里说这个”? 如果是后者,您需要查找[dcl.init]/p17。 - T.C.
“数组初始化器必须是初始化列表”的错误信息相当误导人。哪个编译器会显示这个错误信息? - Cheers and hth. - Alf
3
你可能应该将这个标记为C语言,因为这就是该行为的来源。另外,struct A的目的是什么? - juanchopanza
@Cheersandhth.-Alf:也许点击一下写着“演示”的链接? - Lightness Races in Orbit
2
@juanchopanza:不,这是关于C++程序的C++问题。不应该标记为C。请不要鼓励更多人给C和C++添加双重标记!! - Lightness Races in Orbit
1个回答

3
这个问题有点反向,就像错误信息一样。你不能从另一个数组的名称初始化一个数组,这一点始终如此。初始化器列表与此无关。
引用C++11标准中的8.5/16节:“初始化器的语义如下。目标类型是正在初始化的对象或引用的类型,源类型是初始化表达式的类型。如果初始化器不是单个(可能带括号的)表达式,则未定义源类型。”
  • 如果初始化器是一个(非括号)花括号初始化列表,则对象或引用将进行列表初始化(8.5.4)。
  • 如果目标类型是引用类型,请参见8.5.3。
  • 如果目标类型是字符数组、char16_t数组、char32_t数组或wchar_t数组,并且初始化器是字符串字面值,请参见8.5.2。
  • 如果初始化器是(),则对象将进行值初始化。
  • 否则,如果目标类型是数组,则程序是非法的。

你能否解释一下为什么我们不能用()初始化一个数组?我认为你引用的那句话并没有阻止这样做。据我理解,如果数组初始化不满足“否则,如果目标类型是数组,则程序无效”的所有条件,那么程序就是无效的。在这个例子http://coliru.stacked-crooked.com/a/55282636e770d54b中,它满足了之前的条件,那么问题出在哪里呢? - user2953119
@DmitryFucintv:它是如何“满足先前的要求”的? 先前的要求谈论了初始化程序是(),但您的初始化程序是new int[2](); - Lightness Races in Orbit
那么,“()”初始化器的一个例子是什么?据我所知,“A a()”声明被解析为函数声明。 - user2953119
@DmitryFucintv: 可以在成员初始化列表中实现。Foo::Foo(): myArray() {}; 此外,在您之前的示例中,您已经在 new int[2]() 中使用了有效的 () 初始化程序。 (请注意,正如我之前所说,这并不能使从 new int [2]() 本身进行初始化变得有效!) - Lightness Races in Orbit
是的,确实。谢谢。 - user2953119

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接