c++ - 这个未知大小数组的列表初始化在 C++0x 中有效吗?

标签 c++ arrays initialization c++11

未知大小数组的列表初始化在 C++0x 中有效吗?

int main() { int x[]{0, 1,2,3,4}; return x[0]; }

我相信它是有效的,但希望得到一些确认。

如果有人可以引用 C++0x-FCD支持他们的案子,将不胜感激。

谢谢!

最佳答案

这来自 8.5/16第一个项目符号 8.5.4列表初始化和来自 8.5.4/3第三个项目符号 8.5.1聚合初始化然后 8.5.1/4

An array of unknown size initialized with a brace-enclosed initializer-list containing n initializer-clauses, where shall be greater than zero, is defined as having elements

对象是 = { ... } 之间的数组时的唯一区别和 { ... }是第一个叫做copy-list-initialization,第二个叫做direct-list-initialization,所以两者都是列表初始化。在这两种情况下,数组的元素都是从初始化列表的元素复制初始化的。

请注意,如果数组有大小而列表为空,则这些形式之间存在细微差别,在这种情况下 8.5.4第二个项目符号适用:

struct A {
  explicit A();
};

A a[1]{};    // OK: explicit constructor can be used by direct initialization
A a[1] = {}; // ill-formed: copy initialization cannot use explicit constructor

此差异不适用于包含内容的列表,在这种情况下,第三个项目符号再次适用

struct A {
  explicit A(int);
};

A a[1]{0};    // ill-formed: elements are copy initialized by 8.5.1
A a[1] = {0}; // ill-formed: same.

<罢工>

与之前的草案相比,FCD 改变了这一点,现在即使使用显式默认构造函数,使用空初始化列表进行初始化也始终有效。这是因为 FCD 指出元素是值初始化的,而值初始化不关心显式性,因为它不对默认构造函数进行重载决策(无论如何它无法找出更好或更差的匹配)。之前的草案在构造函数上使用了正常的重载决议,因此在复制初始化期间拒绝了显式默认构造函数。 This defect report做了那个改变。

关于c++ - 这个未知大小数组的列表初始化在 C++0x 中有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2613562/

相关文章:

php - 获取字段不工作

javascript - 在 JavaScript 中创建随机数组

c++ - GCC 生成的程序集

arrays - 与普通数组相比,为什么线性数组的类型签名会发生变化?

c++ - 旧的 allocator::construct 和新的 allocator::construct 以及显式构造函数之间有什么区别?

c - 初始化包含文件的结构

c# - 初始化列表属性的最佳实践?

c++ - 在结构中初始化一对结构

c++ - 在信号处理程序中,如何知道程序在哪里被中断?

c++ - 如何从 C++ DLL 返回的指针获取 VBA 中的整个矩阵?