此代码不能用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
换句话说,编译器不产生基类的默认构造函数,而是尝试调用删除的拷贝构造函数作为唯一可用的重载。
这是正常的行为吗?
是的,因为如果任何构造函数是*用户声明*,则默认构造函数被抑制。 – Xeo
为什么要删除一个被认为是构造函数声明的构造函数?这是违反直觉的。 – kounoupis