C++ 11 Base构造函数使用"using"关键字委派/转发到派生类

iam*_*ind 7 c++ constructor using default-constructor c++11

struct B {
  B () {}
  B(int i) {}
};

struct D : B {
  using B::B;  // <--- new C++11 feature
};

D d1; // ok
D d2(3); // ok
Run Code Online (Sandbox Code Playgroud)

现在,如果我在体内添加一个新的构造函数struct D,例如:

struct D : B {
  using B::B;
  D(const char* pc) {}  // <--- added
};
Run Code Online (Sandbox Code Playgroud)

然后D d1;开始给出编译器错误(ideone尚未升级,我使用的是g ++ 4.8.0)?但D d2(3);仍然有效.

为什么在内部添加新构造函数时会打折默认构造函数struct D

dch*_*tri 4

之间有细微的差别

struct D : B {
 using B::B;
 D(const char* pc) {}  // <--- added
};
Run Code Online (Sandbox Code Playgroud)

相对

struct D : B {
 using B::B;
};
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,编译器会自动为您生成默认的“D(){}”构造函数。但如果您为 D 创建自己的构造函数,则默认的“D(){}”将不再可用。当然,您继承了 B 的默认构造函数,但这并没有告诉编译器默认情况下如何构造 D。

  • @DyP 作为猜测?因为你已经可以通过`D() = default;`继承默认的ctor。对于复制/移动,使用“D(B const&amp;)”和“D(B&amp;&amp;)”可能非常容易出错。 (3认同)
  • 我可能会添加另一个猜测:如果默认 ctor 是通过 `using B::B;` 继承的,那么您不能只继承 `B` 的非默认 ctor,而不继承默认 ctor。如果存在用户定义的构造函数,则不会隐式声明默认构造函数,因为这很容易出错,这也适用于此处。 (3认同)
  • 您知道为什么默认 ctor 没有被继承吗? (2认同)