C++ 此未知大小数组的列表初始化在C+中有效吗+;0x?
此未知大小数组的列表初始化在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)。它比硬编码常量更安全,如果添加或删除条目,常量可能会变得无
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代码>格式同样不正确。因此,在任何情况下,您都无法做到这一点,但该标准似乎没有对数组引用进行深思熟虑。