类中删除的析构函数显示为虚拟/直接基类或一类非静态数据成员

时间:2014-11-14 05:11:17

标签: c++

关于隐式删除复制/移动构造函数的情况有一条规则:

  

隐式声明的复制/移动构造函数是内联公共   同类的成员。 X类的默认复制/移动构造函数   如果X有:

,则定义为已删除(8.4.3)      

[...]

     

- 类型的任何直接或虚拟基类或非静态数据成员   使用从默认值中删除或无法访问的析构函数   构造函数,或

     

[...]

因为我找不到反映规则的例子,所以我不清楚。请考虑以下代码:

struct A
{
    ~A() = delete;
};

struct B : A
{
    A a;
    B(){ }; //error error: attempt to use a deleted function B(){ };
    B(const B&&)  = delete;
};

B *b = new B;

int main() { }

DEMO

由于删除了移动构造函数没有参与重载解析,我预计错误将类似于“隐式删除复制构造函数”。但我得到了关于已明确定义的已删除B()的错误。你能提供反映这条规则的例子吗?

2 个答案:

答案 0 :(得分:0)

仅根据您提供的摘录,以下是一个示例:

struct inner
{
    ~inner() = delete;
};

struct outer
{
    inner inst;

    // Can't destroy "inst"; outer now has an implicitly
    // deleted destructor and copy/move constructor.
};

答案 1 :(得分:0)

请看第5点:显然已经删除了您的基类dtor,因此您遇到了这个问题。

link:http://en.cppreference.com/w/cpp/language/default_constructor

  

删除了隐式声明的默认构造函数

     

如果满足以下任何条件,则类T的隐式声明或默认默认构造函数未定义(直到C ++ 11)被定义为已删除(自C ++ 11开始):

     
      
  1. T具有引用类型的成员,没有大括号或等号   初始化。 (自C ++ 11起)

  2.   
  3. T有一个没有用户定义的默认构造函数的const成员或者   支持或相等的初始化程序(自C ++ 11起)。

  4.   
  5. T有一个成员(没有支持或相等的初始化程序)(从C ++ 11开始),   它有一个已删除的默认构造函数或其默认构造函数   这个构造函数是模糊的或不可访问的。

  6.   
  7. T具有默认删除的直接或虚拟基础   构造函数,或者它是模糊的或不可访问的   构造

  8.   
  9. T有一个直接或虚拟的基础,它有一个删除的析构函数,或者   从此构造函数无法访问的析构函数。

  10.   
  11. T是一个至少有一个变异成员与非平凡成员的联盟   默认构造函数。       (自C ++ 11起)

  12.   
  13. T是一个联合,其所有变体成员都是const。
  14.