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) {}

这将禁止从intto 的隐式转换XY,这是在您调用单参数test1函数时发生的情况。

于 2012-04-29T14:19:08.473 回答
-2

我不明白为什么这对你不利。您的代码中实际上没有其他匹配项。你用一个参数调用了一个函数,你得到了最好的匹配。

如果你有这个,那么它会有所不同:

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 回答