C++ 已删除默认构造函数

C++ 已删除默认构造函数,c++,C++,如果类。。。有一个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; } 上面的规则

如果类。。。有一个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::Foo()公开

否则我相信这是私人的


这就是你想要的吗?

我认为这应该行得通

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

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

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

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


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

我认为您的引用与此无关,因为
Foo
确实明确定义了默认构造函数。这句话并不是说你的代码是正确的。@KerrekSB你是对的,但是这本书一定省略了一些我也应该知道的其他规则,因为其他规则都没有提到任何与默认构造函数相关的内容。(关于何时删除复制控件成员和默认构造函数有4条规则。)没问题,很乐意提供帮助。此外,Bar类需要一个构造函数,否则,它不知道如何初始化私有FO成员。@冈音不是默认的初始化,即默认使用FoO的默认构造函数?@ USE20154,我从C++入门第五版中得到:“我们必须使用构造函数初始值设定项列表为常量、引用或没有默认构造函数的类类型的成员提供值。“主要问题未在本答复中提及。它是“调用隐式删除的默认Bar构造函数”。这是因为,Bar有一个非静态常量成员,并且它不能由默认构造函数初始化,因此它被隐式删除。但是,如果Foo没有显式构造函数,为什么Bar的构造不被认为是微不足道的(因此被跳过/删除)?Foo非常简单,不管有没有这个显式构造函数,它实际上什么都不做!
class Foo {
  public:
  Foo() { }
};

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