2

概念によればBitmaskType、実装では、次のステートメントが適切に形成されていることを保証する必要があります: (§17.5.2.1.3.4 に記載)

式 X & Y がゼロ以外の場合、値 Y がオブジェクト X に設定されます。

ここで、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のバグですか、それともここで何か間違っているのですか? はいの場合、この種のチェックを実行する適切な方法は何ですか?

すでに gcc バグリストを確認しましたが、このトピックをカバーするものは見つかりませんでした。

4

1 に答える 1

4

クラスのメンバーは、暗黙的に、またはその逆enumに変換することを意図していません。intビットマスクタイプがクラスに変換されていることを確認するか、クラスintのゼロ値を使用することができます。enum後者の方が望ましいと思います。

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

(ビット単位の演算は比較よりも優先順位が高く、ビットマスク型のブール値andをビット単位で表すことはあまり意味がないため、ビット単位の演算の前後にも括弧を追加しました)。and

これを確認する最も簡単な方法は、7.2[enum.dcl]段落9です。

...この暗黙的な列挙型からint型への変換は、スコープ付き列挙型には提供されないことに注意してください。

ただし、これは非規範的な例の範囲内です。標準でスコープルールのルールを追跡するには、変換が許可されているすべてのケースを除外する必要があり、現在、この演習はあまり面白くありません。

于 2012-11-24T20:04:01.510 に答える