2012-11-24 92 views
2

按照BitmaskType理念,實現必須保證下面的語句是很好formend:(在§17.5.2.1.3.4上市)比較BitmaskType與零的正確方法?

The value Y is set in the object X if the expression X & Y is nonzero.

,其中X和Y是概念型BitmaskType的。

當您嘗試以下簡單的代碼片段用gcc 4.7我得到模板扣錯誤:

#include <future> 

int main() { 
    (std::launch::async & std::launch::async) != 0; 
} 

錯誤:

error: no match for 'operator!=' in '(std::launch)1 != 0' 
... followed by tons of deduction errors 

這是海灣合作委員會中的錯誤還是我剛開了什麼在這裏?如果是,那麼執行這種檢查的正確方法是什麼?

我已經檢查過gcc的bug列表,但找不到涵蓋這個主題的任何內容。

回答

4

enum類的成員並不意味着隱式轉換爲int,反之亦然。您可以確保將您的位掩碼類型轉換爲int或使用enum類的零值。我認爲後者爲首選:

(std::launch::async & std::launch::async) != std::launch() 

(我還添加了括號周圍的按位and操作,因爲它的優先級高於比較,它並沒有真正多大意義逐位and一個布爾值帶有位掩碼類型)。

看到這種最簡單的方法是7.2 [enum.dcl]段落9:

... Note that this implicit enum to int conversion is not provided for a scoped enumeration: ...

是這樣的,但是,一個非規範的實施例之內。跟蹤標準中範圍規則的規則可能需要排除允許轉換的所有情況,並且目前不太喜歡此練習。

+0

好的,謝謝,看起來不錯。是的,我忘了在代碼中複製時添加大括號。 'std :: launch()'保證始終滿足上面提到的要求嗎? – inf

+0

我會這樣想的。追逐它的方法是查看枚舉的默認初始化意味着什麼。我很確定它變成零初始化,但我現在還沒有追趕它。 –

+1

這是值初始化,而不是默認初始化,標量和枚舉類型的值初始化始終爲零初始化。 – ildjarn