0

全部,

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

考虑以下:

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 编译的。

蒂亚!

4

1 回答 1

1

该错误似乎来自该行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):

  • 如果声明了析构函数或复制操作或赋值操作,则移动操作符被标记为已删除,
  • 如果只声明了一个移动运算符,则另一个被标记为已删除,
  • 如果声明了移动复制操作或移动分配操作,则将常规复制/分配操作标记为已删除。
于 2020-08-14T07:48:26.693 回答