【问题标题】:Deleted destructor in the class appeared as a virtual/direct base class or as a type of non-static data member类中删除的析构函数显示为虚拟/直接基类或非静态数据成员类型
【发布时间】:2014-11-14 05:11:16
【问题描述】:

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

隐式声明的复制/移动构造函数是内联公共 其类的成员。类 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() 的错误,这是我明确定义的。您不能提供一个反映该规则的示例吗?

【问题讨论】:

  • “已删除的移动构造函数不参与重载决议” - 仅适用于定义为已删除的默认移动构造函数。它不适用于显式删除的移动构造函数。

标签: c++


【解决方案1】:

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

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

struct outer
{
    inner inst;

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

【讨论】:

    【解决方案2】:

    看第五点:很明显你已经删除了你的基类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。

    【讨论】:

    • 但在我的例子中,默认构造函数是隐式声明的。
    • 这就是我要说的,here。如果这不是你的答案,那我就完全糊涂了,你在找什么?
    • B() 在问题中不是隐式声明的默认构造函数。
    • 你评论了它但是为什么我不想评论它,虽然我在他的评论中也发现了同样的问题But in my case defauolt constructor was declared implicitly,可能是我认为他不想理解,或者严重混淆他自己的东西。
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 2013-11-12
    • 2014-02-23
    • 2010-11-14
    • 2014-03-23
    • 2021-01-31
    • 2023-03-23
    • 2016-04-30
    相关资源
    最近更新 更多