1

これはばかげた質問かもしれませんが、この記事を読んで安全な bool イディオムを使用しようとすると、コンパイル エラーに混乱します。以下は私のコードで、main() 関数でエラーが発生する行を示しています。

// is OK case
class BoolVer_OK {
    bool m_OK;

public:
    BoolVer_OK(bool ok) : m_OK(ok){}
    operator bool() {  return m_OK; }
};

//  Not OK Case
class BoolVer_NotOK {
    bool m_notOK;

public:
    BoolVer_NotOK(bool ok) : m_notOK(!ok){}
    bool operator !() const{ reportexecution;  return !m_notOK; }
};

main()
{
    BoolVer_OK ok(true);
    BoolVer_NotOK notOK(true);
    ok<<1;  // Line#1     is valid
    notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
return 0;
}

#Line2 に到達しているのに、#Line1 でエラーが発生しなかった理由。どちらも演算子の前にブール値になり<<ます。

4

3 に答える 3

7

okをサポートしておりoperator bool、C++ には暗黙のキャストと昇格と呼ばれる優れた機能があります。この場合、二項シフト演算子<<boolに昇格され、intこれが 1 だけシフトされます。

2 番目のケースでは、その演算子を指定していないため、暗黙的に int に変換 (およびプロモート) するものはなく、エラーが発生します。シフトの前に呼び出してみてください!notOk。これで、昇格される bool ができました。

于 2011-11-01T09:38:32.427 に答える
1

コンパイラーが自動的に呼び出しを挿入しoperator!、それを否定して、必要なものを取得するとはbool思いません。あなたが提供したリンクで私が見たものから、彼らは二重否定でテストを行います!!.

于 2011-11-01T09:37:51.053 に答える
1
ok<<1;  // Line#1     is valid
notOK << 1; // Line#2: error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')

これは、ok がbool暗黙的に (オーバーロードされた演算子) に変換されるのに対し、notOK にはその演算子がないために発生します。

次のコードをテストします。

  BoolVer_OK ok(true);
  BoolVer_NotOK notOK(true);
  int z = ok<<1;  // is valid
  //notOK << 1; // error: inavlid operand to binary expression ('BoolVer_notOK' and 'int')
  int x = false << 1;
  return 0;

シフト演算子の左側のブール値は int に変換されてからシフトされます。

于 2011-11-01T09:40:24.797 に答える