如何在 g++-10 中结合基类显式构造函数和指定初始化?

aby*_*s.7 2 c++ g++ c++20

我有一个简单的例子:

struct A {
    explicit A(int a) : a(a) {}
 protected:
    int a;
};
struct B : public A { int b = 0, c = 0; };

// Attempts to get the code compiled:
B b1 { A(1),   .c = 2 };  // fine with clang-11
B b2 { A{1},   .c = 2 };
B b3 { .A{1},  .c = 2 };
B b4 { {1},    .c = 2 };
B b5 { .a = 1, .c = 2 };
Run Code Online (Sandbox Code Playgroud)

第一个示例失败g++10 -std=c++20并出现错误:

错误:要么应指定所有初始值设定项子句,要么不应指定其中任何一个

虽然在 clang++-11 上没问题。

是否有任何正确的语法方法可以实现以下目标:

  • 使用显式构造函数初始化基础对象,
  • 部分初始化结构。

或者在这种特殊情况下 Clang 编译器不符合 C++20 标准?我看到这个问题,它的答案表明是这样的:mixing designated initializers with non-designated initializers, which is not allowed.

Nic*_*las 5

你不能。目前,还没有办法在还需要初始化基类的花括号初始化列表中使用指定的初始化器。有一个关于它的提案,但显然目前 C++ 中还没有。