2017-02-09 131 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; 

我的理解是這樣的:

說P的地址是100,新分配的內存地址是200

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


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

在上面的描述,是的unique_ptr指向新分配的內存本身,避免'p'。那麼,不應該打印'ptr'給我200?

回答

2

那麼,不應該打印'ptr'給我200?

它應該,如果標準庫指定std::unique_ptr應流式傳輸到標準流。換言之,應該存在operator <<的過載std::unique_ptr

但是,該標準沒有指定這樣的東西,因此流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 s的實例時,出現編譯錯誤的原因。