gpt4 book ai didi

c++ - move 包含 vector> 的可分配类

转载 作者:行者123 更新时间:2023-11-30 01:47:35 26 4
gpt4 key购买 nike

类 Foo 有一个右值引用构造函数,它 move 包含的 unique_ptr vector 那么为什么下面的代码会给出以下错误,无论有没有 std::movemainFoo() 上?

error C2280: 'std::unique_ptr<SomeThing,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
class Foo{
public:
Foo(){

}
Foo(Foo&& other) :
m_bar(std::move(other.m_bar))
{};

std::vector<std::unique_ptr<SomeThing>> m_bar;
};

int main(int argc, char* argv[])
{
Foo f;
f = std::move(Foo());
return 0;
}

最佳答案

这个:

 f = std::move(Foo());

不调用 move 构造函数。它调用 move 赋值运算符。此外,它是多余的,因为 Foo() 已经是一个右值,所以它等同于:

f = Foo();

由于您声明了一个 move 构造函数,因此未声明 move 赋值运算符 - 因此不存在。所以你要么必须提供一个:

Foo& operator=(Foo&& other) {
m_bar = std::move(other.m_bar);
return *this;
}

或者,由于所有成员自己实现 move 操作,您可以只删除 move 构造函数并依赖编译器生成的隐式 move 构造函数和 move 赋值。

关于c++ - move 包含 vector<unique_ptr<T>> 的可分配类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31430533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com