4

从概念上讲,我认为以下内容不会侵犯隐私。但这是被禁止的。

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;
}

添加手动构造函数将允许对私有成员进行大括号初始化。但是聚合和 pod 的美妙之处在于您需要的编码量很少,因此这很烦人。

另一方面,我认为这是对隐私的侵犯,但这是标准允许的。

4

2 回答 2

6

不存在具有私有或受保护的非静态数据成员的聚合之类的东西。聚合的所有非静态数据成员都必须是公共的。

private:
    int c;

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

于 2018-01-25T02:19:20.690 回答
0

我认为杰里·科芬是对的。该类将无权禁止其私有/受保护成员被初始化为来自客户端的任何值,或被其假设的“聚合初始化”取消初始化。

于 2022-02-01T20:08:58.337 回答