我的代码如下:
#include <cmath>
#include <iostream>
float foo(float f) {
std::cout << "float\n";
return f;
}
double foo(double d) {
std::cout << "double\n";
return d;
}
int main() {
int i = 16;
// foo(i); // ambiguous call, of course
return (int) std::sqrt(i);
}
即使使用 ,最后一行中的调用也不会报告模棱两可-pedantic -std=c++98 -Wall -Wextra
,但它不一定在其他编译器中工作,原因相同foo(i)
。
gcc 将以下内容添加到命名空间std
:
template<typename _Tp>
inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
double>::__type
sqrt(_Tp __x)
{ return __builtin_sqrt(__x); }
也就是说,它inline double sqrt(X)
为所有整数类型 X添加。
我感谢 g++ 尽最大努力帮助我,但是有什么(合法的)方法可以让它诊断出我的代码中的错误吗?
[编辑:我使用的是 gcc 4.3.4,但如果其他版本的 gcc 可以诊断它,那么我也对这个事实感兴趣!]