繁体   English   中英

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

[英]Deleted destructor in the class appeared as a virtual/direct base class or as a type of non-static data member

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

隐式声明的copy / move构造函数是其类的内联公共成员。 如果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

因为删除的move构造函数不参与重载解析,所以我预计该错误将类似于“ Copy构造函数被隐式删除”。 但是相反,我得到了有关删除的B()的错误,我明确定义了它。 您能否提供一个反映该规则的示例?

仅根据您提供的摘录,以下为示例:

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

struct outer
{
    inner inst;

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

看第5点:显然是您已经删除了基类dtor,所以遇到了这个问题。

链接: http//en.cppreference.com/w/cpp/language/default_constructor

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

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

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

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

  3. T有一个成员(没有花括号或等于的初始值设定项)(自C ++ 11起),该成员具有已删除的默认构造函数,或者其默认构造函数不明确或无法从此构造函数访问。

  4. T具有直接或虚拟基数,该基数具有已删除的默认构造函数,或者从该构造函数不明确或不可访问。

  5. T具有直接或虚拟基础,该基础具有已删除的析构函数,或无法从此构造函数访问的析构函数。

  6. T是具有至少一个具有非平凡默认构造函数的变体成员的联合。 (自C ++ 11起)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM