Аргумент по умолчанию типа 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:

сообщил об этой проблеме в Microsoft

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

Что касается того, является ли это ошибкой компилятора или "неопределенным поведением", я позволю гуру компилятора перезвонить.