Мой код выглядит следующим образом:
#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 могут диагностировать его, меня тоже интересует этот факт!]