【问题标题】:C++11 Base constructor delegating/forwarding to derived class with "using" keywordC ++ 11基本构造函数委托/转发到使用“使用”关键字的派生类
【发布时间】:2013-05-03 01:34:07
【问题描述】:
struct B {
  B () {}
  B(int i) {}
};

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

D d1; // ok
D d2(3); // ok

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

struct D : B {
  using B::B;
  D(const char* pc) {}  // <--- added
};

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

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

【问题讨论】:

  • 看起来标准规定了这种行为:“对于候选继承构造函数集中的每个非模板构造函数除了没有参数的构造函数或具有单个的复制/移动构造函数参数,构造函数被隐式声明 [...]" [class.inhctor]/3 为什么?不知道。。
  • 请注意,您链接到的演示根本不支持继承的构造函数。您可以尝试here,但目前似乎已关闭。
  • @DyP,在代码 sn-p 中你没有添加新的 D(const char*) 构造函数
  • @iammilind m(你是对的..
  • @iammilind 无法发布指向“正确”版本的实时示例的链接,链接太长,无法发表评论...... :(

标签: c++ c++11 constructor using default-constructor


【解决方案1】:

两者之间存在细微差别

struct D : B {
 using B::B;
 D(const char* pc) {}  // <--- added
};

对比

struct D : B {
 using B::B;
};

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

【讨论】:

  • 你有什么线索为什么默认的ctor没有被继承?
  • 是的,正如我在对 OP 的评论中所说,只有非默认非复制非移动 ctor 是/可以被继承的。
  • @DyP 作为猜测?因为您已经可以通过D() = default; 继承默认 ctor。对于复制/移动,拥有D(B const&amp;)D(B&amp;&amp;) 可能过于容易出错。
  • 我可能会添加另一个猜测:如果默认 ctor 是由 using B::B; 继承的,那么您不能只继承 B 的非默认 ctor 而同时继承默认 ctor。如果存在用户定义的 ctor,则不会隐式声明默认 ctor,因为这很容易出错,这也适用于此处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2015-08-18
  • 2014-11-27
  • 2013-10-10
  • 2016-07-19
相关资源
最近更新 更多