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

  • 本文关键字:一起 构造函数 c++ c++20
  • 更新时间 :
  • 英文 :


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

class B {
public:
explicit B(int) {}
};
struct A {
B b;
};
class C {
public:
C() : a{.b{33}} {}
A a;
};

使用最新版本的gcc编译会出现此错误(wandbox(

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}} {}
|           ^~~~~~~~~

但是clang的最新版本编译代码fine(wandbox(

哪个编译器是正确的?

这是一个gcc错误(提交了99566(。

来自[dcl.init.agr]/4.2的规则是:

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

元素(b(应该从大括号或相等的初始值设定项({33}(初始化。完全可以,这不是复制初始化。gcc接受B b{33},同样的事情也应该发生在这里。

最新更新