我有点惊讶在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类型函数,因为它有一个相同类型的构造函数!我不希望这种情况发生,我该怎么做才能防止这种情况发生?
答案 0 :(得分:6)
明确XY
构造函数:
explicit XY(int v) : x(v), y(v) {}
这将禁止从int
到XY
的隐式转换,这是您调用单参数test1
函数时发生的情况。
答案 1 :(得分:-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 ++不喜欢使用隐式构造函数。它倾向于“先键入,然后在构造函数中使用该类型的任何对象。”
但你所拥有的是一个论证与两个论点。我不知道为什么这是一个问题。