为什么对私有成员的聚合不支持C ++大括号初始化?

时间:2018-01-25 02:13:45

标签: c++ uniform-initialization list-initialization

从概念上讲,以下内容并不违反我的意见。但这是被禁止的。

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的美妙之处在于你需要的少量编码,因此这很烦人。

另一方面,this is a privacy breach in my opinion但标准允许这样做。

1 个答案:

答案 0 :(得分:3)

没有私有或受保护的非静态数据成员的聚合。聚合的所有非静态数据成员都必须是公共的。

private:
    int c;

导致B不再是聚合。因此聚合初始化不再起作用。