2012-03-22 16 views
23

可能性の重複:
Returning unique_ptr from functionsなぜunique_ptrをコピーできますか?

20.7.1.2 [unique.ptr.single]定義は次のようにコンストラクタをコピーします。だから、

// disable copy from lvalue 
unique_ptr(const unique_ptr&) = delete; 
unique_ptr& operator=(const unique_ptr&) = delete; 

、なぜ次のコードコンパイルいい?

#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; 
} 

私はこのようにそれをコンパイル:

g++ -O3 -Wall -Wextra -pedantic -std=c++0x kel.cpp 

コンパイラ:G ++バージョン4.6.1 20110908(Red Hatの4.6.1-9)

+18

+1あなたが実際にどのコンパイラを使用しているのか、どのようにコードをコンパイルしたのかを実際に教えてください。 StackOverflow上のまれな光景です。 –

+0

http://stackoverflow.com/questions/4316727/returning-unique-ptr-from-functionsを参照してください。 – Sjoerd

答えて

42

ローカル変数を返すと、式は右辺値として扱われるため、自動的にに移動します。したがって、次のようになります

return std::move(p); 

それはunique_ptr(unique_ptr&&)コンストラクタを呼び出します。

主な機能では、bar()は、値である一時的な値を生成し、mainpにも正しく移動されます。

+0

いいえ、サブオブジェクトは自動的に移動されません。 – Xeo

+0

12.8/31は私の質問と同じ正確な例があります。あなたとナワズの両方が正しいです –

+0

@Xeoあなたは正しいです。それについての質問はありませんでしたか?うん、http:// stackoverflowがある。"return std :: move(from return)"のようになります。これは、以下のようになります。com/questions/9183087/will-member-sub-object-of-a-functi –

1

私は左辺値からコピーがあることを考えます無効にしますが、 "bar()"は右辺値なのでOKです。 rvaluesからコピーできることは間違いありません。

+3

実際、それは価値ではなく、コピーではありません。 – ulidtko

13

それはをコピーしないあり、それはを動かしています。

returnステートメントがこれに相当します

return std::move(p); 

Pedantically言えば、それは意味的に等価でです。実際には、コンパイラはコードを最適化し、移動コンストラクタへの呼び出しを取り除くことができます。しかし、それはあなたが次のように書いた場合にのみ可能です:

return p; //It gives the compiler an opportunity to optimize this. 

これはお勧めです。 ないある

return std::move(p); //No (or less) opportunity to optimize this. 

推奨:あなたがこれを書く場合は、コンパイラは最適化する機会を持っていません。 :-)

関連する問題