声明被c++删除的函数的条件

Posted

技术标签:

【中文标题】声明被c++删除的函数的条件【英文标题】:Conditions to declare function deleted by c++ 【发布时间】:2020-08-14 07:28:58 【问题描述】:

所有,

编译器自己声明删除函数的条件是什么?

考虑以下:

class Foo

public:
    Foo();
    virtual void func1() = 0;
    virtual void func2() = 0;
    virtual bool func3();


class Bar : public Foo

public:
    Bar(int param1);
    virtual void func1() override;
    virtual void func2() override;
    virtual bool func3() override;


class Baz

public:
    Baz(std::unique_ptr<Foo> &foo)
    
        m_foo = foo;
    
private:
    std::unique_ptr<Foo> m_foo;

我在分配时遇到编译器错误(MSVC 2019):

attempting to reference a deleted function

这是用 C++11 编译的。

TIA!

【问题讨论】:

【参考方案1】:

错误似乎来自m_foo = foo这一行

unique_ptr 无法复制,因此unique_ptr&amp; operator=(const unique_ptr&amp;) is deleted

唯一指针是关于独占所有权。因此,如果您想将所有权转让给 baz,则需要移动 unique_ptr。

例如:

Baz(std::unique_ptr<Foo> foo) : m_foostd::move(foo)


对于编译器声明删除特殊成员的条件(通过声明,我们的意思是常规声明或 =default 或 =deleted):

如果声明了析构函数或复制操作或赋值操作,则将移动操作符标记为已删除, 如果只声明了一个移动操作符,则另一个标记为已删除, 如果声明了移动复制操作或移动分配操作,则将常规复制/分配操作标记为已删除。

【讨论】:

std::move() 是 C++14。我使用 C++11。另外,我想我找到了原因 - operator=(const std::unique_ptr &amp;) 在文档中被标记为已删除,我不知道如何修复它。 (参考cplusplus.com/reference/memory/unique_ptr/operator=) std::move 带有 c++11 及其移动语义。对于运营商,正如我在答案中所说,这是有意的。也许使用shared_ptr 的共享所有权更适合您的情况?

以上是关于声明被c++删除的函数的条件的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中显式删除移动构造函数的用例 [关闭]

PostgreSQL删除数据

学习c++:错误:使用已删除函数

在 C++ 中的 main() 函数中声明的类

Xcode 指示 C++ 不存在的已删除变量的未声明标识符错误

如何声明指针成员以禁止删除它[重复]