停止函数的隐式转换

5

今天我遇到了一个奇怪的情况,我需要一个函数不要隐式转换值。

在谷歌上搜索后,我找到了这个链接:http://www.devx.com/cplus/10MinuteSolution/37078/1954

但我认为为每种我想要阻止的类型使用函数重载有点愚蠢,所以我做了以下操作。


void function(int& ints_only_please){}

int main() { char a=0; const int b=0; function(a); function(b); }

我把代码给一个朋友看,他建议在int前加上const,这样变量就不可编辑了。然而,当我这样做时,编译器开始正常编译,但实际上不应该如此。请看下面的内容了解详情。


void function(const int& ints_only_please){}

int main() { char a=0; int b=0; function(a); //编译器应该在这里停止,但是对于const int它没有停止 function(b); }

有人知道为什么吗?


char 可以隐式转换为 int - John Dibling
2个回答

16

使用模板来获得所需的效果:

template <class T>
void foo(const T& t);

template <>
void foo<int>(const int& t)
{

}

int main(){
  foo(9); // will compile
  foo(9.0); // will not compile
  return 0;
}

请注意,我们只为int编写了一个特殊版本的模板,因此将任何其他类型作为模板参数的调用将导致编译错误。

2
不要忘记,signed int(或 int)!= unsigned int。你需要为每个类型编写一个函数。 - Raphael Bossek
好的,谢谢。选择哪个答案是正确的很困难,但我认为我会选择你的,因为它有更深入的例子。 - General Sirhc
@General Sirhc:我一定误解了问题。你直接问的唯一问题是“有人知道这是为什么吗?”,而这个答案并没有直接回答这个问题。 - CB Bailey
挑剔一点:有人可能会注意到上面的代码不会导致“编译错误”,而是链接器错误。 - Martin Ba
我没有收到编译错误 - 我收到了链接错误。 - Erel Segal-Halevi
显示剩余4条评论

7

将临时变量绑定到const引用是合法的,但不能绑定到非const引用。

char 可以隐式转换为 int,并且可以将结果作为临时变量绑定到 const int&函数参数上,从而延长临时变量的生命周期,直到函数退出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接