聚合字段构造函数必须是公共的才能在C++中使用聚合初始化吗?

请考虑带有带有私有构造函数B的类字段的聚合结构的代码A

class A { A(int){} friend struct B; };
struct B { A a{1}; };

int main()
{
    B b; //ok everywhere, not aggregate initialization
    //[[maybe_unused]] B x{1}; //error everywhere
    [[maybe_unused]] B y{}; //ok in GCC and Clang, error in MSVC
}

我的问题是关于B. 由于初始化是代表调用代码(main此处的函数)进行的,我预计编译器必须拒绝它,因为A的构造函数是私有的。事实上B{1},所有编译器的构造都失败了。

但令我惊讶的B{}是,GCC 和 Clang 都接受了该构造,演示:https : //gcc.godbolt.org/z/7851esv6Y

并且只有 MSVC 拒绝它并显示错误 error C2248: 'A::A': cannot access private member declared in class 'A'

是 GCC 和 Clang 中的错误,还是标准允许他们接受此代码?

以上是聚合字段构造函数必须是公共的才能在C++中使用聚合初始化吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>