关于从函数返回 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);
}
根据 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 asstd::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);
}