如何从函数正确返回对象?

问题描述 投票:0回答:2

我有一个不应复制的对象,只能移动,因此,我试图确保函数返回该对象的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

}
c++ move temporary-objects
2个回答
2
投票

您可以执行以下操作:

static Foo createNewFoo() {
    return Foo();
}

由于Foo()已被当作r值参考,所以不需要std::move


2
投票

[您正在构造一个临时对象,并将其绑定到作为返回值的右值引用,该临时对象将在完整表达式后立即销毁,然后始终悬挂返回的引用。

将函数更改为按值返回就可以了;右值将被移到返回值。

Foo createNewFoo()
{
    return Foo();
}

BTW:对于上述代码,由于Foo foo = createNewFoo();copy elision将不会复制/移动任何内容,自C ++ 17起就可以保证。

© www.soinside.com 2019 - 2024. All rights reserved.