具有私有成员的Struct的构造函数

时间:2012-11-25 13:44:15

标签: c++ struct c++11 private-members

请考虑以下代码:

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正常工作。)

1 个答案:

答案 0 :(得分: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.a初始化1,使用ss.b初始化"asdf",使用ss.c形式的表达式值初始化int(),是,0。 ]

C ++ 03 standard8.5.1§1

  

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