Аргумент по умолчанию типа float = gibberish - PullRequest
9 голосов
/ 30 июня 2011

У меня возникли проблемы при использовании аргумента по умолчанию типа 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.36867e-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 Ответ

9 голосов
/ 30 июня 2011

Кажется, проблема с аргументом шаблона по умолчанию и преобразованием между double и float.Эта проблема не возникает, если вы не используете шаблоны.

Вставьте «f» в конце этого аргумента шаблона по умолчанию так, чтобы оно обрабатывало значение как «число с плавающей точкой» вместо double.Это, кажется, исправляет.

template<typename T>
void fun(T t = 1e-05f);

Но после применения вышеуказанного исправления, если вы объявите это

fun<double>()

, вы получите эквивалентную ошибку.Поэтому лучшее исправление, которое работает как для чисел с плавающей точкой, так и для двойных чисел, - это использовать приведение следующим образом:

template<typename T>
void fun(T t = (T)(1e-05));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...