请考虑以下代码:
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正常工作。)
答案 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)。