Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 此未知大小数组的列表初始化在C+中有效吗+;0x?_C++_Arrays_Initialization_C++11 - Fatal编程技术网

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

C++ 此未知大小数组的列表初始化在C+中有效吗+;0x?,c++,arrays,initialization,c++11,C++,Arrays,Initialization,C++11,此未知大小数组的列表初始化在C++0x中有效吗 int main() { int x[]{0, 1,2,3,4}; return x[0]; } 我相信这是有效的,但希望得到一些确认 如果有人能引用美国的话来支持他们的观点,我们将不胜感激 谢谢 是的,它是有效的,几十年来一直有效,甚至在C中也是如此。大小只需设置为提供的元素数。不幸的是,我不知道参考资料 (增加了奖金…)如果需要元素数量,请使用sizeof(x)/sizeof(*x)。它比硬编码常量更安全,如果添加或删除条目,常量可能会变得无

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

int main() { int x[]{0, 1,2,3,4}; return x[0]; }
我相信这是有效的,但希望得到一些确认

如果有人能引用美国的话来支持他们的观点,我们将不胜感激


谢谢

是的,它是有效的,几十年来一直有效,甚至在C中也是如此。大小只需设置为提供的元素数。不幸的是,我不知道参考资料

(增加了奖金…)如果需要元素数量,请使用
sizeof(x)/sizeof(*x)
。它比硬编码常量更安全,如果添加或删除条目,常量可能会变得无效


编辑:正如评论中指出的,所讨论的代码缺少一个
=
(我遗漏的一个事实),这是从当前的C或C++标准中无效的。

< P>这从“代码>第一个符号到<代码> 8.5.4< /代码>列表初始化,从<代码> 8.5.4//3 < /代码>第三个弹头到<代码> 8.5.1< /代码>聚合初始化,然后<代码> 8.5.1/4 < /COD> > < < /P> 使用大括号内的初始值设定项列表初始化的未知大小的数组,包含n个初始值设定项子句,其中应大于零,定义为具有元素

如果对象是
={…}
{…}
之间的数组,则唯一的区别在于第一种称为复制列表初始化,第二种称为直接列表初始化,因此这两种类型都是列表初始化。在这两种情况下,数组的元素都是从初始值设定项列表的元素进行复制初始化的

请注意,如果数组具有大小且列表为空,则这些表单之间存在细微差异,在这种情况下,
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声明元素是值初始化的,而值初始化并不关心显式性,因为它不会对默认构造函数执行重载解析(无论如何,它无法找出更好或更差的匹配)。之前的草案对构造函数使用了正常重载解析,因此在副本初始化期间拒绝了显式默认构造函数。改变了吗

错。如果没有=符号,它只在C++0x(不在C++03中)中有效。谢谢:)关于使用空列表初始化与使用非空列表初始化的btw之间的差异,这一点很有趣(但非常微妙)。我想知道对称是否会有更好的东西?你是否知道:int(&&arr)[]={1,2,3};或者允许使用int(&&arr)[3]={1,2,3}?@Faisal,注意也
显式A(int=0)
是一个显式的默认构造函数。因此,这一变化可能会影响到比人们最初想象的更多的项目。但我认为FCD的行为更有益,因为“显式”并没有真正说明默认构造,而是更多地说明了参数转换:)@Faisal,目前标准中数组引用的情况有点奇怪。例如,见。例如,我们点击“否则程序格式不正确”。
int(&&arr)[]={}还有其他一些情况点击“…或者如果T是任何引用类型,并且初始值设定项列表没有元素”,但是它的格式不正确,因为它试图构造一个零元素数组。@Faisal,对于
int(&&arr)[={0}
我们有”否则,如果初始值设定项列表有一个元素,则从该元素初始化对象然而,这听起来很奇怪,因为这似乎意味着这种情况只能发生在对象上,但实际上在这种情况下,它发生在引用上。在任何情况下,如果我们将“object”替换为“object或reference”,那么它将尝试执行
int(&&arr)[]=0格式同样不正确。因此,在任何情况下,您都无法做到这一点,但该标准似乎没有对数组引用进行深思熟虑。