Аргумент по умолчанию типа float = gibberish
у меня есть некоторые проблемы с использованием аргумента по умолчанию типа float:
#include <wchar.h>
#include <iostream>
template<typename T>
void fun(T t = 1e-05);
template<typename T> inline
void fun(T t)
{
std::cout << t << std::endl;
}
int wmain(int argc, wchar_t* argv[])
{
fun<float>();
_getwch();
return 0;
}
он печатает -1.36867 e-033 вместо эквивалентности 1e-05. Что здесь происходит?
Я использую VC++10.
EDIT1:
спасибо всем за ваши ответы. Но приведение аргумента по умолчанию не работает в следующем случае:
template<typename T>
void fun(T t = static_cast<T>(1e-05));
template<typename T> inline
void fun(T t)
{
std::wcout << t << std::endl;
}
int wmain(int argc, wchar_t* argv[])
{
fun<double>();
fun<float>();
_getwch();
return 0;
}
Так что это определенно ошибка и стоит репортаж?
EDIT2:
1 ответов
похоже, проблема с аргументом шаблона по умолчанию и преобразованием между double и float. Проблема не возникает, если вы не используете шаблоны.
вставьте "f "в конце этого аргумента шаблона по умолчанию, чтобы он рассматривал значение как" float " вместо double. Это, кажется, чтобы исправить это.
template<typename T>
void fun(T t = 1e-05f);
но после применения вышеуказанного исправления, если вы объявите это
fun<double>()
вы получите ошибку. Так что лучше исправить, что работает для обоих поплавки и двойники должны использовать бросок следующим образом:
template<typename T>
void fun(T t = (T)(1e-05));
Что касается того, является ли это ошибкой компилятора или "неопределенным поведением", я позволю гуру компилятора перезвонить.