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

Constructor for Struct with Private Members

本文关键字:结构 构造函数 成员      更新时间:2023-10-16

考虑以下代码:

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

为什么foo1有效而foo2无效?结构初始值设定项构造函数对于类A是否可见

B b = {0};

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


C++03标准8.5.1骨料
第7段:

如果列表中的初始化程序少于聚合中的成员,则每个未显式初始化的成员都应进行值初始化(8.5)。[示例:

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

1初始化ss.a,用"asdf"初始化ss.b,用形式为int()的表达式的值初始化ss.c,即0。]

C++03标准8.5.1§1:

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