1. ホーム
  2. c++

[解決済み] なぜc++にはブーリアンに対する&&=や||=がないのですか?

2022-05-29 05:24:41

質問

このような "非常に悪いこと"。 が起こる可能性があります。 &&= そして ||= の構文糖として使用されました。 bool foo = foo && barbool foo = foo || bar ?

どのように解決するのですか?

A bool のみとすることができます。 true または false を使うことができます。そのため &=|= は比較的安全です(私はこの表記が特に好きではないのですが)。確かに、これらは論理演算ではなくビット演算を実行しますが (したがって短絡はしません)、これらのビット演算は明確に定義されたマッピングに従っており、事実上論理演算と同等なのです。 である限り 両オペランドが bool . 1

ここで他の人が言っていることに反して bool のような異なる値を持ってはいけません。 2 . にその値を代入すると bool に代入すると、それは true に変換されます。

に無効な値を入れることはできません。 bool を使用することです。 reinterpret_cast をポインタの上に置くことです。

int i = 2;
bool b = *reinterpret_cast<bool*>(&i);
b |= true; // MAY yield 3 (but doesn’t on my PC!)

しかし、このコードはいずれにせよ未定義の動作になるため、適合するC++のコードではこの潜在的な問題を安全に無視することができます。


1 Angewのコメントが示すように、これはかなり大きな注意点であることは認めます。

bool b = true;
b &= 2; // yields `false`.

その理由は b & 2 は整数の昇格を行い、式は次のように等価になります。 static_cast<int>(b) & 2 となり、その結果 0 に変換され、さらに bool . ということは、確かに operator &&= があれば型安全性が向上するのは事実です。