关于从函数返回unique_ptr的问题



根据文件,

我们已经对局部值和函数进行了隐式移动return语句中的参数。以下代码只编译罚款:

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

但是,以下代码不编译

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

相反,您必须键入

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

以下是我的问题:

1.std::unique_ptr<T>没有复制ctor。事实上,不应该有一个函数可以接受声明为std::unique_ptr<T>的参数。请参阅此代码片段,它不会编译。

#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.为什么

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

不编译?

有人能解释一下这件事吗?

1。std::unique_ptr<T>没有复制构造函数。实际上,不应该有函数可以接受声明为std::unique_ptr<T>

事实上,只要将原始std::unique_ptr移动到此本地参数,这是可以的

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

2.为什么选择

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

不编译?

虽然ptr的类型是一个右值引用,但它本身就是一个左值,因此return ptr将调用复制ctor,您需要使用std::moveptr再次强制转换为右值

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

相关内容

  • 没有找到相关文章

最新更新