2012-06-07 71 views
0

我下面的文件boost/smart_ptr/detail/operator_bool.hpp和遇到下面的代碼片段,我不明白爲什麼來自boost :: smart_ptr的&this_type :: px返回1?

typedef T * this_type::*unspecified_bool_type; 

operator unspecified_bool_type() const // never throws 
{ 
    return px == 0? 0: &this_type::px; 
} 

我寫的與XCode的一些測試代碼和&this_type::px總是返回1.爲什麼?

一些C++大師能分享你的想法嗎?

回答

1

&this_type::px是用來獲得相當於true的布爾值的技巧。

由於升壓不使用bool類型,而是不指定它是什麼,它採用了指針到成員投它總是返回true的等效表示對現有成員(即不nullptr什麼的投從0)。

見4.12:

算術,無作用域枚舉,指針,或指向 構件類型的prvalue可以轉換爲bool類型的prvalue。

指向成員的布爾轉換總是發生在整數上下文中,因爲在C++中沒有從指針到成員轉換爲整數。

3

這是一個小竅門,被稱爲Safe Bool Idiom

的問題是,如果你寫一個轉換操作符來bool

operator bool() const; 

然後,它可以在一些棘手的情況下使用,例如:1 + sharedpbool獲得晉升到int ......傻吧?

因此,訣竅是使用可以轉換爲bool的類型,但在編譯期間所有其他操作都會引發錯誤。推薦的方法是在類中使用指向成員的指針,並將其編輯爲顯式名稱,以便錯誤消息更容易理解。


用C++ 11,這一招已經過時了,因爲explicit預選賽可應用於轉換操作符:

explicit operator bool() const { return px; } 

更愉快,不是嗎?

+0

它可能聽起來像一個矛盾,但C++ 11解決方案可能被稱爲*'顯式'隱式*轉換函數。 +1 btw! – Nawaz

+0

「對於C++ 11,這個技巧已經過時了」 - 並不完全(正如我所理解的那樣),而不是如果你想允許隱式轉換爲'bool'(假設賦值給一個'bool'對象),但拒絕你提到的算術。 – hvd

+0

@hvd:好吧,對'bool'的隱式賦值從來不是這裏主要關心的,主要是它與'if(ptr)'慣用測試有關。但你說得對,它仍然可以用來允許這種隱式轉換。 –

1

它不是1,但它是由ostream輸出爲1(布爾)如果你沒有打開boolalpha標誌。 ostream沒有針對成員指針的特殊輸出運算符。

相關問題