2012-02-21 14 views
7

我正在考慮在已經使用C++ 11功能的代碼中將安全布爾成語的所有實例替換爲explicit operator bool(因此舊版編譯器無法識別顯式轉換操作員無所謂),所以我想知道它是否會導致一些微妙的問題。安全布爾成語與顯式運算符之間的不兼容bool

因此,什麼是所有可以通過從陳舊,失去光澤安全布爾成語切換到新的和有光澤explicit operator bool將可能造成的不兼容問題(哪怕是最微小的)?

編輯:我知道,無論如何,切換是一個好主意,因爲後者是一種語言特性,編譯器很好理解,所以它不會比事實上只是一個黑客更糟。我只是想知道可能的差異。

回答

3

如果您在代碼中使用了safe-bool轉換不正確,那麼只有explicit operator bool是不兼容的,因爲它不允許您輕鬆地做錯事情。否則,應該沒問題。實際上,即使存在問題,您仍然應該切換到explicit operator bool,因爲如果您這樣做,那麼您可以在使用安全布爾轉換時識別問題。

根據this article,一些編譯器發射使用成員函數指針,安全,布爾實施低效的指令,

當人們用這個成語開始,人們發現,有一些編譯器的效率損失 - 的成員函數指針導致編譯器頭痛,導致地址被提取時執行速度較慢。儘管差異很小,但目前的做法通常是使用成員數據指針而不是成員函數指針。

+0

當然你是對的。但是我有一個原因,我用'language-lawyer'標記了這個。我希望標準本身遵循純粹的事實,而不是對良好實踐的建議。得澄清,但無論如何感謝。 – Fanael 2012-02-21 19:00:12

+0

@Fanael:標準,C++ 03和C++ 11都沒有提到safe-bool習慣用法,所以不可能引用它來支持我所說的。我隱含的意思是C++ 11已經引入了「明確的操作符bool」,我認爲其中一個原因是「顯式操作符bool」比所謂的更安全**安全布爾成語。 – Nawaz 2012-02-21 19:06:35

+1

但是標準會談到用於實現安全布爾成語的事情。所以,雖然這個標準對這個成語本身毫無用處,但它的確切保證幾乎是文檔隱含的。 – Fanael 2012-02-21 19:11:04

4

也許最大的區別,假設你的代碼是免費的bug(我知道,不是一個安全的假設),將在某些情況下,你可能想的隱式轉換正好bool。轉換函數explicit不匹配。

struct S1 
{ 
    operator S1*() { return 0; } /* I know, not the best possible type */ 
} s1; 

struct S2 
{ 
    explicit operator bool() { return false; } 
} s2; 

void f() 
{ 
    bool b1 = s1; /* okay */ 
    bool b2 = s2; /* not okay */ 
} 
+2

這不是安全的布爾成語。 – Nawaz 2012-02-21 18:58:12

+4

我已經注意到我使用的指針類型不是最好的類型,它作爲一個例子很好,因爲這和正確的實現之間的差異與我的答案無關,而且這更易讀。 – hvd 2012-02-21 19:00:53