2017-11-22 26 views
15

BOOLタイプをunsigned intにマッピングした古いコンパイラで書かれた他の人のコードを使用していますが、私のコンパイラではboolにマップされています。彼のコードのいくつかの場所では、彼はbool型のビット単位のシフト演算子<<を使用しています。これは私が一度も見たことがないもので、コンパイラはそれが文句を言っていないときに私を驚かせました。C++でboolをビット単位でシフトできますか?

有効なC++ですか? boolは自動的にintまたはuintに昇格されますか?

私はthis related questionを見ましたが、これは別の問題を明確にしていますが、シフト演算子には対応していません。

+0

standardeseを辿ることなく、[参照](http://en.cppreference.com/w/cpp/language/operator_arithmetic)で演算子がどのように動作するかを確認できます。 – chris

+0

私は以前にビット単位のシフトを見たことがあり、その使用法を理解しています...私は 'bool'型で使われていることを見たことがありません。私はコンパイラが許していることを知っていますが、他の人はそうですかそれは私が知りたいことです。 – Phlucious

+0

ブールのビットシフトは論理的にどうすればよいですか? –

答えて

10

からのシフト演算子[expr.shift]

オペランドは、一体またはスコープ外の列挙型でなければならないと積分キャンペーンが行われます。結果の タイプが促進左オペランドの

boolコードが十分に形成されているように、一体型(boolintに促進され、結果がintである)であることです。 [conv.prom]から

、我々はに昇進ブール値を整数何を示しています

タイプboolのprvalueがfalseはなってきてゼロと真になると、タイプintのprvalueに変換することができone

その後、シフトは正常に動作します。 (ありがとう、@クリス)

+1

この値は、通常のbool-int変換に従います。 'false'は0に変換され、' true'は1に変換され、0以外は 'true'に変換されます。この時点では、シフト前後の 'bool 'との間の変換を伴う' i​​nt'の規則的なシフトです。 – chris

+0

@chris:ありがとう。更新しました。 – AndyG

+0

これは意図された動作であることを明確にしてくれてありがとうございます。これらの引用をリンクに更新できますか?私は[foo.bar]構文を理解していません。 – Phlucious

0

右手に何があっても、ブールをシフトする結果の型は常にintです。

関連する問題