5

我的 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 确实明确定义了一个默认构造函数。有任何想法吗?

4

3 回答 3

7

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

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

否则我相信它是私人的。

这是你要找的吗?

于 2013-01-28T15:02:20.173 回答
5

当类构造不是微不足道时,默认构造函数被省略。

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

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

于 2013-01-28T15:05:22.600 回答
1

我认为这应该有效

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

class Bar {
public:
  Bar() : foo() {}
private:
  const Foo foo;
};
于 2013-01-28T15:02:54.663 回答