C++ 您可以将显式构造函数与指定的初始值设定项一起使用吗?

C++ 您可以将显式构造函数与指定的初始值设定项一起使用吗?,c++,c++20,C++,C++20,在下面的代码中,成员b的初始化是否合法 class B { public: explicit B(int) {} }; struct A { B b; }; class C { public: C() : a{.b{33}} {} A a; }; 使用最新版本的gcc编译时出现此错误() 但是最新版本的clang编译代码很好() 哪个编译器是正确的?这是一个gcc错误(已提交) 规则,从,是: 否则,将从相应的初始值设定项子句复制初始化元

在下面的代码中,成员
b
的初始化是否合法

class B {
    public:
        explicit B(int) {}
};

struct A {
    B b;
};

class C {
 public:
    C() : a{.b{33}} {}

    A a;
};
使用最新版本的gcc编译时出现此错误()

但是最新版本的clang编译代码很好()

哪个编译器是正确的?

这是一个gcc错误(已提交)

规则,从,是:

否则,将从相应的初始值设定项子句复制初始化元素,或使用相应指定初始值设定项子句的大括号或相等初始值设定项初始化元素


元素(
b
)应该从大括号或相等的初始值设定项(
{33}
)初始化。那很好,那不是复制初始化。gcc接受
BB{33}
,同样的事情应该在这里发生。

这是CWG2359。
prog.cc: In constructor 'C::C()':
prog.cc:12:11: error: converting to 'B' from initializer list would use explicit constructor 'B::B(int)'
   12 |     C() : a{.b{33}} {}
      |           ^~~~~~~~~