4

(var)...がブール値の代わりに数値変換を使用するのはなぜですか?私は両方を実装するクラスを持っています:

operator int() { ....}
operator bool() { ....}

しかし、私が使用する場合:

if (my_class_var) ....;

次に、変換が?!!?!intの代わりに使用されますboolean

編集:versedmaraldが言うようにそれは正しいです。私は違いが何であるかを見つけました..私は実際に使用しています:

operator int() { ....}
operator bool() const { ... }

まだ魅了されていますが、なぜ違いがありますか?gccバージョン4.6.2

4

3 に答える 3

3

あなたの言うことが本当なら、あなたのコンパイラは標準に違反していると思います:

(§6.4/ 4)switchステートメント以外のステートメントで初期化された宣言である条件の値は、コンテキストでboolに変換された宣言された変数の値です(第4節)。その変換が不正な形式である場合、プログラムは不正な形式です。[...]

(明確にするために、これは、説明ifswitchステートメントである§6.4のコンテキストにあります。)

于 2012-09-14T07:01:24.677 に答える
1

2つありますused-defined implicit conversion chains

初め -class -> bool -> no conversion

2番 -class -> int -> bool

n3337 4/2

注:特定のタイプの式は、いくつかのコンテキストで暗黙的に他のタイプに変換されます。

— ifステートメントまたは反復ステートメント(6.4、6.5)の条件で使用される場合。宛先タイプはboolです。

n3337 4/3

いずれかの暗黙的な変換の効果は、宣言と初期化を実行し、変換の結果として一時変数を使用することと同じです。

引用符は本当にそれを意味します

if (class_var) 

if (bool _ = class_var)

n3337 13.3.3 / 1

これらの定義を前提として、すべての引数iについて、ICSi(F1)がICSi(F2)よりも悪い変換シーケンスではない場合、実行可能な関数F1は別の実行可能な関数F2よりも優れた関数であると定義されます。

—コンテキストは、ユーザー定義の変換(8.5、13.3.1.5、および13.3.1.6を参照)による初期化と、F1の戻りタイプから宛先タイプ(つまり、初期化されるエンティティのタイプ)への標準変換シーケンスです。 F2の戻りタイプから宛先タイプへの標準変換シーケンスよりも優れた変換シーケンスです。[ 例:

struct A {
A();
operator int();
operator double();
} a;
int i = a; // a.operator int() followed by no conversion
//is better than a.operator double() followed by
//a conversion to int
float x = a; //ambiguous: both possibilities require conversions,
//and neither is better than the other

—終了例

したがって、コンパイラはを選択する必要がありますoperator boolclass -> bool -> no standart conversionclass -> int -> standard conversion to bool

于 2012-09-14T07:01:28.273 に答える
1

そうではありません(g++少なくとも使用しています)。変換演算子にエラーがあると思います。

#include <iostream>
class A {
public:
    operator int() { return 1; }
};

class B {
public:
    operator int() { return 1; }
    operator bool() { return false; }
};

int main() {
    A a;
    B b;

    if (a)
        std::cout << "true\n";
    else
        std::cout << "false\n";

    if (b)
        std::cout << "true\n";
    else
        std::cout << "false\n";
}

出力:

true
false
于 2012-09-14T06:58:39.917 に答える