PTR <T >>
Foo类有一个右值引用构造函数,用于移动unique_ptr所包含的向量,那么为什么下面的代码会给出以下错误:无论是否在main中的Foo()上都有std :: move?
错误1错误C2280:'std :: unique_ptr>&std :: unique_ptr <_Ty,std :: default_delete <_Ty >> :: operator =(const std :: unique_ptr <_Ty,std :: default_delete <_Ty >>&)' :尝试引用已删除的函数
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());
不会调用移动构造函数。 它调用移动赋值操作符。 此外,它是多余的,因为Foo()
已经是一个右值,所以它相当于:
f = Foo();
既然你声明了一个移动构造函数,移动赋值操作符没有被声明 - 所以没有一个。 所以你要么提供一个:
Foo& operator=(Foo&& other) {
m_bar = std::move(other.m_bar);
return *this;
}
或者,由于所有成员都自己实现移动操作,因此可以删除移动构造函数,并依赖编译器生成的隐式移动构造函数和移动赋值。
链接地址: http://www.djcxy.com/p/59679.html上一篇: ptr<T>>