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

问题描述

全部

编译器本身声明函数已删除的条件是什么?

请考虑以下事项:

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!

解决方法

错误似乎来自m_foo = foo

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

唯一指针与专有所有权有关。因此,如果要将所有权转让给baz,则需要移动unique_ptr。

例如:

Baz(std::unique_ptr<Foo> foo) : m_foo{std::move(foo)}
{
}

对于这种情况,编译器声明删除了一个特殊成员(通过声明,我们指的是常规声明或= default或= deleted):

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...