【问题标题】:Inheriting constructors in C++20 (Visual Studio 2019)在 C++20 (Visual Studio 2019) 中继承构造函数
【发布时间】:2021-09-28 21:29:55
【问题描述】:

我正在使用带有 /std:c++latest 的 Visual Studio 2019 (v16.10.3) 并且可以编译:

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 中加入的新东西还是微软特有的东西?

【问题讨论】:

    标签: c++ visual-studio visual-studio-2019 c++20


    【解决方案1】:

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

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

    当我们添加一个公共成员时它甚至可以工作:

    class Base
    {
    public:
       Base(int ) {}
    };
    
    struct Derived : public Base
    {
    // no constructors declared in Derived
        int y;
    };
    
    int main() {
       Derived d(5, 4);
    }
    

    Live

    【讨论】:

      【解决方案2】:

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

      Derived 没有与Base 的构造函数匹配的构造函数;您只是通过为其子对象 Base 提供有效的初始化程序来初始化聚合 Derived

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        • 2014-11-26
        • 2017-08-09
        • 2019-01-21
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多