Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why am I allowed to copy unique_ptr? [duplicate]

Tags:

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)

like image 265
BЈовић Avatar asked Mar 22 '12 17:03

BЈовић


1 Answers

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.

like image 150
R. Martinho Fernandes Avatar answered Oct 17 '22 22:10

R. Martinho Fernandes