9

此代码无法使用 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

换句话说,编译器不会为基类生成默认构造函数,而是尝试调用已删除的复制构造函数作为唯一可用的重载。

这是正常的行为吗?

4

1 回答 1

16

C++11 §12.1/5 状态:

类的默认构造函数是可以在没有参数的情况下调用X的类的构造函数。X如果 class 没有用户声明X的构造函数,则没有参数的构造函数被隐式声明为默认值 (8.4)。

Base(const Base&) = delete;算作用户声明的构造函数,因此它会抑制隐式默认构造函数的生成。解决方法当然是声明它:

Base() = default;
于 2013-08-16T17:03:29.633 回答