此代码无法使用gcc 4.7.0编译:
class Base
{
public:
Base(const Base&) = delete;
};
class Derived : Base
{
public:
Derived(int i) : m_i(i) {}
int m_i;
};
错误是:
c.cpp: In constructor ‘Derived::Derived(int)’:
c.cpp:10:24: error: no matching function for call to ‘Base::Base()’
c.cpp:10:24: note: candidate is:
c.cpp:4:2: note: Base::Base(const Base&) <deleted>
c.cpp:4:2: note: candidate expects 1 argument, 0 provided
换句话说,编译器不会为基类生成默认构造函数,而是尝试将已删除的复制构造函数作为唯一可用的重载调用。
这是正常行为吗?
答案 0 :(得分:12)
C ++11§12.1/ 5陈述:
类
X
的默认构造函数是类X
的构造函数,可以在不带参数的情况下调用。如果类X
没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。
您的Base(const Base&) = delete;
计为用户声明的构造函数,因此它会禁止生成隐式默认构造函数。解决方法当然是声明它:
Base() = default;