删除的复制构造函数导致删除的默认构造函数

kou*_*pis 7 c++ deleted-functions c++11

这段代码不能用gcc 4.7.0编译:

class Base
{
public:
    Base(const Base&) = delete;
}; 

class Derived : Base
{
public:
    Derived(int i) : m_i(i) {}

    int m_i;
};
Run Code Online (Sandbox Code Playgroud)

错误是:

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
Run Code Online (Sandbox Code Playgroud)

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

这是正常的行为吗?

Cas*_*sey 13

C++11§12.1/ 5指出:

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

您将Base(const Base&) = delete;计为用户声明的构造函数,因此它会禁止生成隐式默认构造函数.解决方法当然是声明它:

Base() = default;
Run Code Online (Sandbox Code Playgroud)

  • 我发现了这个:[ISO/IEC JTC1 SC22 WG21 N2346](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm#delete),声明所有查找和重复解析发生在*之前*注意到删除的定义,因此这个答案是正确的. (3认同)