2012-11-25 66 views
1

考虑下面的代码:构造结构与私人会员

class A 
{ 
private: 
    struct B { private: int i; friend class A; }; 

public: 
    static void foo1() 
    { 
     B b; 
     b.i = 0; 
    } 

    static void foo2() 
    { 
     B b = {0}; 
    } 
}; 

为什么foo1工作,但不foo2的? A类不是结构体初始化构造函数吗?无论如何要在C++ 11中完成这项工作吗?

(注意,删除私人品牌foo2的工作。)

回答

3

为什么foo1工作,但不是foo2?类A不是结构体初始化构造函数吗?

B b = {0}; 

不起作用,因为B不是聚合。它不是一个聚合,因为它有一个非静态的私有数据成员。如果您删除私人说明符,B将成为一个聚合,因此可以用这种方式进行初始化。


C++ 03标准8.5.1骨料
帕拉7:

如果在列表中更少的初始化值多于在聚集构件,则每个部件未明确初始化的应该进行值初始化(8.5)。 [实施例:

struct S { int a; char* b; int c; }; 
S ss = { 1, "asdf" }; 

初始化ss.a1ss.b"asdf",和ss.c与表单int()的表达式的值,即,0。 ]

C++ 03标准8.5.1§1

聚集是没有用户声明的 构造(12.1),阵列或类(第9节)没有私有或受保护的非静态数据成员(第11章), 没有基类(第10节),也没有虚函数(10.3)。