2012-05-10 343 views
1

我已經使用-std = C++ 0x選項在gcc 4.4.6中啓用了unique_ptr。它似乎工作得很好,正是我所需要的 - 一個定製刪除器的範圍指針。std :: unique_ptr ostream插入器

但是我確實發現了一個問題。

typedef std::unique_ptr<X> XPtr; 

XPtr ptr1(new X); 
XPtr ptr2(new X); 

std::cout << "ptr1 points to " << ptr1 << std::endl; 
std::cout << "ptr2 points to " << ptr2 << std::endl; 

顯示: PTR1點1 PTR2點1

我認爲ostream的插入器被插入所述布爾值。

以下修復它,但我想知道如果這不應該是標準庫的一部分。

template<typename Target, typename Deleter> 
std::ostream & operator <<(std::ostream & out, const std::unique_ptr<Target, Deleter> & value) 
{ 
    // output the raw pointer 
    out << value.get(); 
    return out; 
} 

所以,問題是:這是海灣合作委員會目前的unique_ptr實施的限制,還是我從的unique_ptr期望太高了?

+0

這不應該是這樣。 'unique_ptr'到'bool'的轉換應該標記爲'explicit'。 – pmr

回答

4

這似乎是隨gcc 4.4.6發佈的庫中的一個bug。轉換是

explicit operator bool() const noexcept; 

,不應試圖通過指針插入到一個 ostream被觸發。這應該會導致編譯錯誤,這就是gcc 4.7上發生的錯誤。

編輯: gcc 4.4不支持顯式轉換運算符,因此這當時並不成熟。你應該得到一個更新的gcc版本來真正使用C++ 11。

1

unique_ptr已定義operator bool() const,所以你看到的是unique_ptr對象被轉換爲布爾值。正如您發現的,要打印指針的地址,您需要使用get()方法。

+0

但這不是應該發生的。運營商應該是明確的,不應該在這裏進行轉換。這是一個錯誤。 – pmr

相關問題