2011-06-05 19 views
160

This answer of @R. Martinho Fernandes所示,該安全-布爾成語apperently棄用C++ 11,因爲它可以通過一個簡單的在C++ 11中,安全布爾成語是否過時?

explicit operator bool() const; 

根據在應答§4 [conv] p3標準報價替換:

當且僅當聲明T t=e;格式良好時,對於某些發明的臨時變量t(第8.5節),表達式e可隱式轉換爲類型T。某些語言結構要求將表達式轉換爲布爾值。出現在這樣的背景下的表達式e被說成是上下文轉換到bool是公形成當且僅當該聲明bool t(e);是公形成,對於一些發明臨時變量t(第8.5節)。

突出顯示的部分清楚地顯示了「隱式顯式強制轉換」(在標準中稱爲「上下文轉換」)爲@R。馬蒂奧說的。

的 「某些語言結構」,需要的是 「隱顯式類型轉換」 似乎是以下幾點:

  • ifwhilefor§6.4 [stmt.select] p4
  • 二元邏輯運算符&&||§5.14 [expr.log.and/or] p1爲兩者)
  • 邏輯否定運算符!§5.3.1 [expr.unary.op] p9
  • 條件操作?:§5.14 [expr.cond] p1
  • static_assert§7 [dcl.dcl] p4
  • noexcept§15.4 [except.spec] p2

是我們在標題假設是正確的?我希望我們不會忽略任何潛在的缺點。

+27

+1:我喜歡這種類型的問題,教給我關於即將到來的標準的新東西。 – 2011-06-25 18:57:36

+0

您知道標準中缺少隱式顯式轉換...從另一個「運算符bool」中返回某些東西。例如,如果我有一個叫做p的'shared_ptr'成員並且有這個方法:'operator bool()const {return p; }',它無法編譯。這是愚蠢的國際海事組織。 – David 2016-03-02 18:56:49

回答

115

是的。這是示例僅顯示用戶定義的隱式轉換和明確的用戶定義轉換運算符的問題實際上是invented because of this problem,並且用更清晰和更合理的東西替換所有safe-bool東西。

1

我不會稱之爲「過時」。到目前爲止,並非所有人都在向C++ 11邁進(即使不是年1月)。即使有大量的編碼器,保持代碼向後兼容的能力也是必須的,考慮到這種成語對於圖書館來說似乎比適合程序更明智。

+28

我純粹是在C++ 11的存在下講話。這個問題既不涉及舊代碼,向後兼容性,也不願意改用C++ 11知道的編譯器。另外請注意,C++ 11本身並不完全向後兼容,它引入了重大更改。 – Xeo 2011-12-18 19:43:45

+3

不可能知道,對不起。我並沒有考慮開始時只考慮答案,而是考慮到[C++]和[C++ - faq]這個問題,這使得我認爲對這兩種語言階段的評估是相關的。 – 2011-12-22 22:07:05

+1

你當然是對的,我沒有在問題中明確表述。我會編輯它,謝謝你的擡頭。 – Xeo 2011-12-22 22:59:30

相關問題