如何解决声明被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):
- 如果声明了析构函数或复制操作或赋值操作,则将移动运算符标记为已删除,
- 如果仅声明了其中一个移动运算符,则将另一个标记为已删除,
- 如果声明了移动副本操作或移动分配操作,则将常规副本/分配操作标记为已删除。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。