Ste*_*sop 8 c++ gcc overloading sqrt
我的代码如下:
#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);
}
Run Code Online (Sandbox Code Playgroud)
即使使用了最后一行中的调用,也没有报告含糊不清-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); }
Run Code Online (Sandbox Code Playgroud)
也就是说,它inline double sqrt(X)为所有整数类型X 添加.
我很欣赏g ++尽力帮助我和所有人,但是有没有(合法的)方法让它诊断我的代码中的错误?
[编辑:我正在使用gcc 4.3.4,但如果其他版本的gcc可以诊断它,那么我也对这个事实感兴趣!]
根据
[lib.global.functions]/2 的说法,GCC 添加的这个“有用”标准库在 C++03 中是不符合标准的:
对全局函数签名的调用[在标准库定义中描述]的行为与实现未声明其他全局函数签名的行为相同。
这意味着实现(gcc)不允许添加额外的重载(无论是否有用),只要它们影响程序的可观察行为。