使用基类的ctor的参数调用派生类的ctor

问题描述 投票:0回答:1

浏览我的代码,我发现了一个部分 - 我认为 - 应该是编译时错误,但实际上编译和运行良好。简化版本是:

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


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


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

检查 cppinsights 中的代码片段,对于

main
内的行,它在使用 c++17 或更高版本时生成
Derived obj = {Base(5)};
,并且不能使用 c++14 或更旧版本进行编译。 在 c++14 中,如果我取消注释
//using Base::Base;
那么代码就会编译。我相信这里的 using 自 C++11 起就可用了。在这种情况下,cppinsights 会生成
Derived obj = Derived{5};
。我能明白其中的意义。 我的问题是

  1. 为什么原来的代码用c++17编译。该功能的名称是什么?
  2. {Base(5)};
    是什么意思?大括号的用途是什么?
  3. using Base::Base;
    有什么关系还是完全不一样。

谢谢您的帮助!

constructor c++17 derived-class
1个回答
0
投票

我不知道前两个,但 using 语句与 继承构造函数有关。当想要继承基类的构造函数并且不关心初始化派生类的数据成员时使用它。更详细的解释可以在链接中找到。
与前两个问题一样;我不知道为什么它在 C++17 之后不使用 using 语句就可以工作,或者为什么它只适用于 {} 而不能使用 ()。

© www.soinside.com 2019 - 2024. All rights reserved.