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

这段代码不能用 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

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

这是正常的行为吗?

解决方法

C11§12.1/ 5指出:

A default constructor for a class X is a constructor of class X that can be called without an argument. If there is no user-declared constructor for class X,a constructor having no parameters is implicitly declared as defaulted (8.4).

你的基地(const Base&)=删除;计为用户声明的构造函数,因此它禁止生成隐式认构造函数.解决方法当然是声明它:

Base() = default;

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...