在 C++20 中继承构造函数(Visual Studio 2019)

Inheriting constructors in C++20 (Visual Studio 2019)

我正在使用 Visual Studio 2019 (v16.10.3) 和 /std:c++latest 编译:

class Base
{
public:
   Base(int x) {}
};

class Derived : public Base
{
// no constructors declared in Derived
};

int main() {
   Derived d(5);
}

对于以前版本的标准,我必须使用 using 指令声明继承的构造函数:

class Derived : public Base
{
   using Base::Base;
};

这是 C++20 中的新东西还是微软特有的东西?

Is this something new that was put in C++20 or is it some Microsoft specific thing?

与继承的构造函数无关。改变的是聚合初始化可能在某些条件下使用括号。 Derived 由于没有私有部分,所以被认为是聚合,所以我们直接初始化它的基和成员。

它甚至在我们添加 public 成员时起作用:

class Base
{
public:
   Base(int ) {}
};

struct Derived : public Base
{
// no constructors declared in Derived
    int y;
};

int main() {
   Derived d(5, 4);
}

Live

这是 C++17 允许 类 与基数 类 结合 C++20 规则允许聚合初始化与 () 一起工作的聚合的结果如果括号中的值有效(并且不会调用构造函数),则构造函数语法。所以虽然它看起来像一个构造函数调用,但它实际上是聚合初始化。

Derived 没有匹配 Base 的构造函数;您只是通过为其子对象 Base.

提供有效的初始化程序来初始化聚合 Derived