2016-04-20 9 views
2

私は、標準ライブラリオブジェクトから移動した後、そのオブジェクトが有効であるが未定義の状態にあることを理解しています。しかし、unique_ptrの場合、それはどのように定義されていませんか?経験的には、以下のコードは動作するようです。つまり、p1から移動した後、 "if (p1)"はfalseを評価します。直観的には、これは正しい動作のようです。しかし、私はこれに頼ることができますか?unique_ptr :: operator bool()はmove()dからのunique_ptrに対して定義されていますか?

#include <memory> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    using namespace std; 

    unique_ptr<int> p1 {make_unique<int>(1)}; 
    unique_ptr<int> p2; 

    if (p1) 
     cout << "p1 owns an object" << endl; 
    if (p2) 
     cout << "p2 owns an object" << endl; 

    p2 = move(p1); 

    // Is the following test valid, now that p1 has been moved from? 
    if (p1) 
     cout << "p1 owns an object" << endl; 
    if (p2) 
     cout << "p2 owns an object" << endl; 
} 

出力:

p1 owns an object 
p2 owns an object 

答えて

7

unique_ptrの仕様では、明示的にそのようなポインタに対する移動操作の効果は左側に右側のポインタから所有の転送であると述べています(移動コンストラクタの場合は20.8.1/16、割り当ての場合は20.8.1.2.3/2)。所有転送の概念は、明示的に標準(20.8.1/4)で定義され、それは右側は、転写後nullptrなると言います。

これは、unique_ptrからの状態が有効でないことを意味します。と定義されています。

1

私はこれに頼ることができますか?

はい、できます。移動するとstd::unique_ptrは所有権を移譲することを意味し、operator boolはオブジェクトを所有していないので、確かにfalseを返します。

関連する問題