Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++_C++11_List Initialization - Fatal编程技术网

C++ 列表初始化不能用于私有成员吗?

C++ 列表初始化不能用于私有成员吗?,c++,c++11,list-initialization,C++,C++11,List Initialization,代码由VC++2012编译(最新更新为“2012年11月CTP”) 我希望a1和a2是零初始化的,但不是。a1和a2未初始化 为什么?你的意思是微软的社区技术预览编译器,他们甚至没有足够的信心称之为beta版,但它有缺陷?;) 这是一个错误;它应该像你期望的那样。请如实报告 请注意,这个答案有一个轻微的重写,将最终结果更改为与以前相反的结果。感谢@给了我启发。:) 这是一个bug。Clang 3.2 trunk和GCC 4.7+也同意,并将零初始化成员 是时候喝点标准酒了。注意tx{}(或={}

代码由VC++2012编译(最新更新为“2012年11月CTP”)

我希望a1和a2是零初始化的,但不是。a1和a2未初始化


为什么?

你的意思是微软的社区技术预览编译器,他们甚至没有足够的信心称之为beta版,但它有缺陷?;)

这是一个错误;它应该像你期望的那样。请如实报告

请注意,这个答案有一个轻微的重写,将最终结果更改为与以前相反的结果。感谢@给了我启发。:)

这是一个bug。Clang 3.2 trunk和GCC 4.7+也同意,并将零初始化成员

是时候喝点标准酒了。注意
tx{}(或
={}
)可以解释为列表初始化或聚合初始化
A
此处不是聚合,因为它有私有成员,因此不能由后者初始化

§8.5.1[dcl.init.aggr]p1

聚合是一个数组或类(第9条),其中[…]没有私有或受保护的非静态数据成员[…]

这只剩下列表初始化,该值将同时初始化
a1
a2

§8.5.1[dcl.初始列表]p3

T
类型的对象或引用的列表初始化定义如下:

  • 如果初始值设定项列表没有元素,并且
    T
    是具有默认构造函数的类类型,则对象值已初始化
针对我们的具体情况,值初始化指定如下:

§8.5[dcl.init]p7

如果
T
是没有用户提供构造函数的(可能是cv限定的)非联合类类型,则对象初始化为零[…]


这反过来意味着成员应该归零。

此列表初始化与您的私人成员有什么关系@Tom,如果数据成员是公开的,那么结果将如预期的那样。@TomWijsman:这里有一个巨大的生命暗示:“常识”意味着“我认为这应该是真的,但我的陈述没有支持事实”。我不是说你错了。我是说如果你是对的,你没有给任何人理由相信你是对的。语言不是根据“常识”来定义的,它是由一个标准来定义的。是的,你可以通过“常识”得到一个初步的想法,但在回答问题时,最好依靠更具体的东西。@xmlmx:公认的答案是错误的,而Nicol Bolas的答案是正确的。重新考虑您的接受情况。@TomWijsman:Xeo的回答不正确,标准确定这些成员必须初始化为0。Xeo跳过了引号链中的联接,并错误地将值初始化视为对构造函数的调用(只有在有用户提供默认构造函数时才会如此)。是否确定?成员是
private
,这意味着类型不是聚合,这反过来意味着语法表示对隐式声明的默认构造函数的调用。隐式定义的默认构造函数不初始化POD成员,这意味着不应初始化
a
b
c
。还是我遗漏了什么?实际上,不管我最后的评论,这个答案是正确的。问题中的语法是列表初始化,在本例中,它映射到值初始化,而在本例中,这又意味着零初始化+1@Xeo-“如果是非平凡的,则调用默认构造函数”:我认为非平凡的默认构造函数是指用户定义的构造函数,而不是编译器生成的默认构造函数(在本例中不会调用)。不,如果成员或基具有非平凡的构造函数,则即使是编译器生成的默认构造函数也可以是非平凡的(以此类推,最终导致在链中的某个位置出现一个用户定义的ctor)。@David:那么,将答案改写一点,以纳入我的启示。@damienh:是的,这正是原因所在。如果没有用户定义的构造函数,零初始化将处理对象的POD子成员,隐式定义的默认构造函数将处理具有用户定义的构造函数的成员。你两者都需要--Xeo,我不认为你应该否决这个答案,它有有效的数据可以增加价值。您只需更正最后一部分(我将向上投票,给我一条评论,我将清除所有不再适用的评论:)
struct A
{
private:
    int a, b, c;
};

int main()
{
    A a1{};
    A a2 = {};

    return 0;
}