为什么具有私有成员的聚合不支持 C++ 大括号初始化?
Why is C++ brace initialization not supported for aggregates with private members?
在我看来,从概念上讲,以下内容并未侵犯隐私。但这是被禁止的。
struct A
{
int a;
int b;
int c;
};
struct B
{
int a;
int b;
private:
int c;
};
int main (int argc, char * argv[])
{
auto a = A{1,2,3}; //ok
auto b = A{1,2}; //ok
auto c = B{1,2,3}; //error
auto d = B{1,2}; //error
return 0;
}
添加手动构造函数将允许对私有成员进行大括号初始化。但是聚合和 pods 的美妙之处在于您需要的编码量很少,因此这很烦人。
另一方面,但这是标准允许的。
不存在具有私有或受保护的非静态数据成员的聚合这样的东西。聚合的所有非静态数据成员必须是 public.
private:
int c;
导致 B
不再是聚合。因此聚合初始化不再起作用。
我认为 Jerry Coffin 是对的。 class 无权禁止其 private/protected 成员被初始化为来自客户端的任何值或被其假设的“聚合初始化”取消初始化。
在我看来,从概念上讲,以下内容并未侵犯隐私。但这是被禁止的。
struct A
{
int a;
int b;
int c;
};
struct B
{
int a;
int b;
private:
int c;
};
int main (int argc, char * argv[])
{
auto a = A{1,2,3}; //ok
auto b = A{1,2}; //ok
auto c = B{1,2,3}; //error
auto d = B{1,2}; //error
return 0;
}
添加手动构造函数将允许对私有成员进行大括号初始化。但是聚合和 pods 的美妙之处在于您需要的编码量很少,因此这很烦人。
另一方面,
不存在具有私有或受保护的非静态数据成员的聚合这样的东西。聚合的所有非静态数据成员必须是 public.
private:
int c;
导致 B
不再是聚合。因此聚合初始化不再起作用。
我认为 Jerry Coffin 是对的。 class 无权禁止其 private/protected 成员被初始化为来自客户端的任何值或被其假设的“聚合初始化”取消初始化。