2016-04-06 2 views
2

私はユニークなポインタのxvalue引数の理解を明確にしたいユニークなポインタxvalueセマンティクス?ラムダf2の動作がラムダf1と異なるのはなぜですか?

これは私がstd :: moveとuniqueポインタを学ぶために書いたコード例です。誰もline2がクラッシュする理由を説明することはできますが、line1は動作しますか?私のテストプログラムでlambda f2を動かすと、なぜ、std :: moveの後でも、line1は動作しますか?これはちょうど私の学習のためであるとstd ::移動はr値の参照にちょうどキャストであるので、ない宿題の問題は、私は1つの作品C++ 14とC++ 11

#include <iostream> 
#include <functional> 
#include <memory> 

void test() 
{ 

    std::unique_ptr<int> p (new int(278)); 
    auto f1 = [](std::unique_ptr<int> i){std::cout << *i << std::endl;}; 
    auto f2 = [](std::unique_ptr<int> &&i){std::cout << *i << std::endl;}; 

    f2(std::move(p)); 
    std::cout << *p << std::endl; //line 1 

    f1(std::move(p)); 
    std::cout << *p << std::endl; //line 2 
} 

int main(int argc, const char * argv[]) { 
    test(); 
    return 0; 
} 
+0

編集を追加しましたが、ヘッダを追加しなかったためコンパイルできませんでした –

+0

Xcodeバージョン7.2からコード全体を貼り付けています。はい、申し訳ありませんが、それはタイプミスです。私は非常に残念です –

+0

Apple LLVM 7.0、私はendlの誤植を修正しました。キャッチをありがとう –

答えて

0

ラインに非常に新しいです。実際の譲渡所有権は、通常、移送コンストラクタまたは移送代入演算子によって行われますが、いずれもf2にはありません。 2行目は、f1の引数を渡して引数を渡すとコンストラクタが呼び出され、その後はunique_ptrが空になるためクラッシュします。

関連する問題