根据文件,
我们已经对局部值和函数进行了隐式移动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::move
将ptr
再次强制转换为右值
std::unique_ptr<T> f(std::unique_ptr<T> && ptr) {
return std::move(ptr);
}