如何在g ++ 4.3.4中诊断对sqrt(int&)的模糊调用

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可以诊断它,那么我也对这个事实感兴趣!]

dec*_*ype 2

根据
[lib.global.functions]/2 的说法,GCC 添加的这个“有用”标准库在 C++03 中是不符合标准的:

对全局函数签名的调用[在标准库定义中描述]的行为与实现未声明其他全局函数签名的行为相同。

这意味着实现(gcc)不允许添加额外的重载(无论是否有用),只要它们影响程序的可观察行为。