关于从函数返回 unique_ptr 的问题

Question about returning an unique_ptr from a function

根据 document

We already have implicit moves for local values and function parameters in a return statement. The following code compiles just fine:

std::unique_ptr<T> f(std::unique_ptr<T> ptr) {
    return ptr;
} 

However, the following code does not compile

std::unique_ptr<T> f(std::unique_ptr<T> && ptr) {
    return ptr;
} 

Instead, you must type

std::unique_ptr<T> f(std::unique_ptr<T> && ptr) {
    return std::move(ptr);
}

这是我的问题:

1.There 确实不是 std::unique_ptr<T> 的复制构造函数,不应该有一个函数可以接受声明为 std::unique_ptr<T> 的参数。看到这个code snippet,编译不过

#include <memory>

class FooImage{};

std::unique_ptr<FooImage> FoolFunc(std::unique_ptr<FooImage> foo)
{
    return foo;
}

int main()
{

    std::unique_ptr<FooImage> uniq_ptr(new FooImage);

    FoolFunc(uniq_ptr);
}

2.why

std::unique_ptr<T> f(std::unique_ptr<T> && ptr) {
    return ptr;
} 

不编译?

有人可以解释一下这个问题吗?

1.There is no copy ctor for std::unique_ptr<T> indeed, there should not a function could accept a parameter declared as std::unique_ptr<T>.

其实只要把原来的std::unique_ptr移动到这个局部参数

就可以了
FoolFunc(std::move(uniq_ptr)); // ok
FoolFunc(std::unique_ptr<FooImage>{new FooImage}); // also ok

2.why

std::unique_ptr<T> f(std::unique_ptr<T> && ptr) { return ptr; }

does not compile?

虽然ptr的类型是右值引用,但它本身是一个左值,所以return ptr会调用copy ctor,你需要使用 std::move 再次将 ptr 转换为右值

std::unique_ptr<T> f(std::unique_ptr<T> && ptr) { 
    return std::move(ptr); 
}