我的c ++书中写道(lippman,c ++ primer,第五版,第508页):
如果类...具有const成员,其类型未明确定义默认构造函数和,该成员没有类内初始值设定项,则合成的默认构造函数被定义为已删除。 (emphesis mine)
为什么这段代码会产生错误?
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确实明确定义了一个默认构造函数。有什么想法吗?
答案 0 :(得分:7)
修复错误。你需要让Foo :: Foo()公开。
class Foo
{
public:
Foo() { }
};
否则我相信它是私密的。
这是你想要的吗?
答案 1 :(得分:5)
当类构造不重要时,省略默认构造函数。
这通常意味着要么有一个显式构造函数接收参数(然后你不能假设它可以在没有这些参数的情况下构造)
或者,如果需要在构造中启动其中一个成员或基类(它们本身没有一个简单的构造函数)
答案 2 :(得分:1)
我认为这应该有用
class Foo {
public:
Foo() { }
};
class Bar {
public:
Bar() : foo() {}
private:
const Foo foo;
};