How to diagnose ambiguous call to sqrt(int&) in g++ 4.3.4

Мой код выглядит следующим образом:

#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); }

То есть он добавляет встроенный двойной sqrt (X) для всех целочисленных типов X.

Я ценю использование g ++ лучше всего мне помочь, но есть ли какой-нибудь (законный) способ заставить его диагностировать ошибку в моем коде?

[Изменить: я использую gcc 4.3.4, но если другие версии gcc могут диагностировать это, то меня тоже интересует этот факт!]

8
задан Steve Jessop 19 May 2011 в 13:15
поделиться