5

C++ の最新バージョンでは、ステートメントbool内の条件を評価するときに、クラスの演算子を使用しようとします。演算子が存在しない場合に使用if()されるなど、その他のキャスト演算子。これを以下に示します。intbool

#include <iostream>
using namespace std;

class TwoInts {
  public:
    int a,b;
    operator bool() { cout << "TwoInts to bool" << endl; return 0;}
    operator int()  { cout << "TwoInts to int"  << endl; return 0;}
};

class SixInts {
  public:
    int a[6];
    operator int()  { cout << "SixInts to int" << endl; return 0;}
};

int main(void) {
  TwoInts T;
  SixInts S;
  if (T) cout << "xxx" << endl;
  if (S) cout << "xxx" << endl;
  return 0;
}

このコードを実行しても驚くことはありません:

TwoInts to bool
SixInts to int

古い C++ コードを見てみると、確認したい変更があるようです。
古いバージョンの C++ では、ステートメントintの条件を評価するときにクラスの演算子を使用していましたか? if() もしあれば、それはどのバージョンですか?

提案された出力は次のようになります

TwoInts to int
SixInts to int

質問の理由に関する詳細: 古い大きな整数クラスを変換する際int問題はboolif(). 古いコンパイラにアクセスできなくなったため、古い動作をテストできません。


[編集]
以下の回答といくつかの調査を使用:
回答:はい、ISO 標準 C++ より前の多くのバージョン (1980 年代半ばから 1998 年) には、 a がなく、(または他の数値型)boolへのキャストが使用されていました。int重要なコンパイラのバリエーションが存在しました - それはプレスタンダードでした。

最初の C++ ISO 標準は 1998 年に登場しました (ISO/IEC 14882:1998 別名 C++98)。タイプを定義しましたbool。したがって、ISO 標準 C++ は常にboolキャスト inを使用してきましたif()

4

2 に答える 2

4

標準 C++ にはありません。厳密に言えば、標準 C++ では、if ステートメントは、そこに含まれる式を に変換しようとしbool、それに基づいて動作を変更します。

ISO/IEC 14882:2003 4.12 [conv.bool]/1:

算術、列挙、ポインター、またはメンバー型へのポインターの右辺値は、bool 型の右辺値に変換できます。ゼロ値、NULL ポインター値、または NULL メンバー ポインター値は false に変換されます。その他の値は true に変換されます。

6.4.1 [stmt.if]/1:

条件 (6.4) が true の場合、最初のサブステートメントが実行されます。選択ステートメントの else 部分が存在し、条件が false になる場合、2 番目のサブステートメントが実行されます。if ステートメントの 2 番目の形式 (else を含むもの) では、最初のサブステートメントも if ステートメントである場合、その内側の if ステートメントに else 部分が含まれる必要があります76)。

ブール値の概念である「true」と「false」への明示的な参照に注意してください。

于 2013-06-07T23:20:17.323 に答える