3

C++ でこの機能を見つけたときは少し驚きましたが、それが起こるとは思っていませんでした。

コードは次のとおりです。

struct XY {
    int x,y;
    XY(int v) : x(v), y(v) {}
};

bool test1(const XY &pos){
    return pos.x < pos.y;
}
bool test1(int x, int y){
    return x < y;
}
void functest(){
    int val = 5;
    test1(val);
}

そのため、オーバーロードが存在するかどうかに関係なく、整数パラメーターを使用して関数を呼び出すことができます。同じ型のコンストラクターがあるため、XY 型関数が使用されます。そうなってほしくないのですが、どうすれば防げますか?

4

2 に答える 2

6

コンストラクターをXY明示的にします。

explicit XY(int v) : x(v), y(v) {}

intこれにより、 からへの暗黙的な変換が禁止されます。これは、単一パラメーター関数XYを呼び出したときに発生します。test1

于 2012-04-29T14:19:08.473 に答える
-2

なぜこれがあなたにとって悪いのか理解できません。あなたのコードには文字通り他に一致するものはありません。1 つのパラメーターを指定して関数を呼び出し、それに最も適したものを取得しました。

あなたがこれを持っていれば、それは違うでしょう:

bool test1(const XY &pos){
    return pos.x < pos.y;
}

bool test1(int x){
    return !x;
}

void functest(){
    int val = 5;
    test1(val);
}

それが最初に実行された場合、C++ は暗黙のコンストラクターを使用することを「好まない」ため、それは悪いことです。「最初に型、次にコンストラクターにその型を持つオブジェクト」を優先します。

しかし、あなたが持っているのは、1 つの引数と 2 つの引数です。なぜこれがここで問題になるのかわかりません。

于 2012-04-29T14:28:45.557 に答える