【问题标题】:deleted default constructor headache删除默认构造函数头疼
【发布时间】:2013-01-28 23:05:22
【问题描述】:

我的 c++ 书是这样说的(lippman,c++ Primer,第五版,第 508 页):

如果类 ... 有一个其类型未明确定义默认构造函数的 const 成员并且该成员没有类内初始化程序,则合成的默认构造函数被定义为已删除。 (我的重点)

为什么这段代码会产生错误?

class Foo {
  Foo() { }
};

class Bar {
private:
  const Foo foo;
};

int main() {
  Bar f; //error: call to implicitly-deleted default constructor of 'Bar'
  return 0;
}

上面的规则似乎表明它不应该是一个错误,因为 Foo 确实明确定义了一个默认构造函数。有什么想法吗?

【问题讨论】:

  • 我不认为你的引用在这里相关,因为Foo 确实明确定义了一个默认构造函数。引用说你的代码没问题是不正确的。
  • @KerrekSB 你是对的,但是这本书必须省略一些我也应该知道的其他规则,因为其他规则都没有提到与默认构造函数相关的任何内容。 (关于何时删除复制控制成员和默认构造函数有4条规则。)

标签: c++


【解决方案1】:

修复您的错误。您需要将 Foo::Foo() 公开。

class Foo
{
public:
    Foo() { }
};

否则我相信它是私人的。

这是你要找的吗?

【讨论】:

  • 没问题,很乐意提供帮助。
  • 另外,Bar类需要一个构造函数,否则它不知道如何初始化私有的foo成员。
  • @GangYin foo 不应该只是默认初始化,即默认使用 Foo 的默认构造函数吗?
  • @user2015453,我只是从 c++ 入门第 5 版中得到的:“我们必须使用构造函数初始化器列表来为 CONST、引用或没有的类类型的成员提供值默认构造函数。”
  • 此答案未解决主要问题。它是“调用 Bar 的隐式删除的默认构造函数。”。这是因为,Bar 有一个非静态常量成员,它不能被默认构造函数初始化,所以被隐式删除。
【解决方案2】:

当类构造不简单时,默认构造函数被省略。

这通常意味着要么有一个显式构造函数接收参数(然后你不能假设它可以在没有这些参数的情况下构造)

或者如果需要在构造中启动成员或基类之一(它们本身没有平凡的构造函数)

【讨论】:

  • 但是如果 Foo 没有显式构造函数,为什么 Bar 的构造不被认为是微不足道的(因此被跳过/删除)? Foo 非常简单,不管有没有这个显式构造函数,它实际上什么都不做!
【解决方案3】:

我认为这应该可行

class Foo {
  public:
  Foo() { }
};

class Bar {
public:
  Bar() : foo() {}
private:
  const Foo foo;
};

【讨论】:

    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 2013-08-19
    • 2016-01-27
    • 2017-05-10
    • 2022-01-22
    • 2011-09-03
    • 2018-07-17
    • 2016-09-13
    相关资源
    最近更新 更多