今天我遇到了一个奇怪的情况,我需要一个不隐式转换值的函数。
看了一些谷歌之后我发现了这个http://www.devx.com/cplus/10MinuteSolution/37078/1954
但是我认为对于我想要阻止的其他类型使用函数重载是有点愚蠢的,所以我做了这个。
void function(int& ints_only_please){}
int main()
{
char a=0;
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); //Compiler should stop here but it doesn't with const int
function(b);
}
有谁知道这是为什么?
答案 0 :(得分:14)
使用模板获得所需效果:
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
编写特殊版本的模板,以便将具有任何其他类型作为模板参数的调用导致编译错误。
答案 1 :(得分:7)
将临时绑定到const
引用是合法的,但不是非const
引用。
可以将char
隐式转换为int
,并且可以将此转换结果的临时值绑定到const int&
函数参数,从而延长临时生命周期,直到函数退出