【问题标题】:Inheriting constructor and default constructor继承构造函数和默认构造函数
【发布时间】:2016-03-24 00:40:33
【问题描述】:

我正在阅读Inheriting constructors here 上的文档。有一个例子:

struct B1 {
    B1(int);
};
struct D1 : B1 {
    using B1::B1;
// The set of inherited constructors is 
// 1. B1(const B1&)
// 2. B1(B1&&)
// 3. B1(int)

// D1 has the following constructors:
// 1. D1()
// 2. D1(const D1&) 
// 3. D1(D1&&)
// 4. D1(int) <- inherited
};

所以写得很清楚D1 has the following constructors: D1(),即默认构造函数。但是当我试图创建一个对象时:

D1 d;

我有一个错误use of deleted function 'D1::D1()'。是文档中的错误还是我误解了什么?

我用 c++14 尝试了 gcc。

【问题讨论】:

  • @POTEMKINDX 您忘记在main() 中添加D1 d;。如果你这样做了,你会发现它不起作用:coliru.stacked-crooked.com/a/220ea673061325fd
  • @POTEMKINDX 你没有调用导致error的构造函数
  • @POTEMKINDX 已更新。顺便说一句,您没有创建实例。
  • @nikitablack 他们说D1() 存在于他们拥有的下一个代码块中的代码块下方D1 e; // Error: D1 has no default constructor
  • @KerrekSB 问题是 cppreference 上的第一个示例说它应该在该示例中具有默认值。

标签: c++ inheritance constructor default-constructor


【解决方案1】:

考虑以下代码:

struct B1                                                                                                                                                                                                
{
    B1(int){}
};

struct D1 : B1 {
    using B1::B1;
};


struct E
{
    E(){}
};


struct F
{
    F(int){}
};

如果你尝试写作

E e;

它会构建得很好,但是

F f;

会失败。通过声明一个接受 int 的 ctor,您实际上删除了默认 ctor。

您的问题代码遵循相同的原则。一旦您将B1 的ctor 拉入D1 - 您实际上已删除了它的默认ctor。

【讨论】:

    【解决方案2】:

    再往下看,它说它没有默认构造函数

    D1e; // 错误:D1 没有默认构造函数

    【讨论】:

    • 所以页面上有相互矛盾的信息,但这并不能解释为什么D1在这种情况下没有默认构造函数。
    • 是的,如果你看到这篇文章en.cppreference.com/w/cpp/language/default_constructor 中的示例,我认为这可能会产生误导,因为还有另一个构造函数,所以没有声明 D()。
    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2018-04-18
    • 2016-12-05
    • 2021-06-02
    • 2017-10-04
    相关资源
    最近更新 更多