Possible Duplicate:
Returning unique_ptr from functions
20.7.1.2 [unique.ptr.single] defines copy constructor like this :
// disable copy from lvalue unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr&) = delete;
So, why the following code compiles fine?
#include <memory> #include <iostream> std::unique_ptr< int > bar() { std::unique_ptr< int > p( new int(4)); return p; } int main() { auto p = bar(); std::cout<<*p<<std::endl; }
I compiled it like this :
g++ -O3 -Wall -Wextra -pedantic -std=c++0x kel.cpp
The compiler : g++ version 4.6.1 20110908 (Red Hat 4.6.1-9)
In the return statement, if you return a local variable, the expression is treated as an rvalue, and thus automatically moved. It is thus similar to:
return std::move(p);
It invokes the unique_ptr(unique_ptr&&)
constructor.
In the main function, bar()
produces a temporary, which is an rvalue, and is also properly moved into the p
in main
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With