2017-02-09 6 views
6

これがなぜ失敗するのか理解できませんか?unique_ptrをcoutに出力する

int *p = new int(10); 
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 
// Below line works well. 
std::cout << "Value pointed ptr " << *ptr << std::endl; 
std::cout << "Value of ptr->get() " << ptr.get() << std::endl; 

私はそれをこのように理解して:

は、新たに割り当てられたメモリのアドレスがunique_ptrを新しく割り当てられたメモリを指している、上記の描写で200

p    new allocated memory 
----------  --------- 
    200    10 
----------  --------- 
100    200 


ptr 
---------- 
    200 
---------- 
300 

で、Pのアドレスが100であると言いますそれ自体、 'p'を避ける。だから、 'ptr'を印刷して200を与えるべきではないのですか?

答えて

2

したがって、 'ptr'を印刷すると200になりませんか?

指定された標準ライブラリstd::unique_ptrが標準ストリームにストリーミング可能である場合、それはすべきです。つまり、std::unique_ptrの場合、operator <<のオーバーロードが存在するはずです。

しかし、標準ではこのようなことは指定されていないため、unique_ptrをストリーミングするとコンパイルエラーが発生します(operator <<はそれを受け付けません)。あなたが発見したように、溶液は次のとおりです。

stream << ptr.get() 
+0

Oho。意味をなさないC++コミュニティを停止していたものを購入して<<をオーバーロードする? –

+1

@HemantBhargava:本当に必要ありません。 C++標準は既に大きすぎて(*)、ほとんど誰も使用しないようなものを追加すると、それが大きくなります。 *:いいえ、私は何を削除するかに関する良い提案はありません。 –

+2

@MartinBonner間引きの提案については、 'std :: vector 'が気になります。 – Angew

9
std::unique_ptr<int> ptr(p); 
// Below line gives compilation error. 
std::cout << "Value of ptr  " << ptr << std::endl; 

は、いくつかのオブジェクトを印刷するのが一般的<<構文を使用することを可能にするには:あなたは、ポインタをストリーミングする必要がある場合は、ポインタを取得しますクラスcoutを使用する場合、operator<<の適切なオーバーロードが実装されている必要があります。

たとえば、あなたはクラスXを持っている場合は、cout << x構文を有効にする場合は、あなたがこのようなoperator<<オーバーロードすることができます。

#include <ostream> // for std::ostream 

std::ostream& operator<<(std::ostream& os, const X& x) 
{ 
    // Implement your output logic for 'x' 
    ... 

    return os; 
} 

C++の標準ライブラリの設計者は、このような過負荷を実装しないことを選びましたstd::unique_ptr;これはunique_ptrのインスタンスで<<を使用しようとすると、コンパイルエラーが発生する理由です。

関連する問題