gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:08:41 24 4
gpt4 key购买 nike

未知大小数组的列表初始化在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com