我有一个不应复制的对象,只能移动,因此,我试图确保函数返回该对象的T &&。我的问题是该对象在返回之前已被销毁,我不知道如何正确执行此操作。
#include <iostream>
class Foo
{public:
Foo() {
a = new int;
std::cout << a << '\n';
}
Foo(const Foo& other) = delete;
Foo(Foo&& other) {
a = other.a; other.a = nullptr;
}
~Foo() {
std::cout << a << '\n';
delete a;
}
void operator= (const Foo& other) = delete;
void operator= (Foo&& other) {
a = other.a;
other.a = nullptr;
}
int* a;
};
Foo&& createNewFoo()
{
return std::move(Foo());
}
int main()
{
Foo foo = createNewFoo(); // The pointer is deleted before this assigns to foo
}
您可以执行以下操作:
static Foo createNewFoo() {
return Foo();
}
由于Foo()
已被当作r值参考,所以不需要std::move
。
[您正在构造一个临时对象,并将其绑定到作为返回值的右值引用,该临时对象将在完整表达式后立即销毁,然后始终悬挂返回的引用。
将函数更改为按值返回就可以了;右值将被移到返回值。
Foo createNewFoo()
{
return Foo();
}
BTW:对于上述代码,由于Foo foo = createNewFoo();
,copy elision将不会复制/移动任何内容,自C ++ 17起就可以保证。