聚合字段构造函数必须是公共的才能在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 中的错误,还是标准允许他们接受此代码?