c++ - float 类型的默认参数 = 乱码

标签 c++ visual-studio visual-studio-2010 templates visual-c++

我在使用 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。

编辑 1:

谢谢大家的回复。 但转换默认参数在以下情况下不起作用:

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

所以这绝对是一个错误,值得报告?

编辑 2:

Reported this issue to Microsoft

最佳答案

默认模板参数和 double 与 float 之间的转换似乎是一个问题。如果您不使用模板,则不会出现此问题。

在该默认模板参数的末尾添加一个“f”,这样它就将该值视为“ float ”而不是 double 。这似乎可以解决问题。

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

但是在应用上面的修复之后,如果你声明这个

fun<double>()

你得到了一个等效的错误。因此,对 float 和 double 都适用的更好解决方法是使用如下转换:

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

至于这是编译器错误还是“未定义行为”,我会让编译器专家插话。

关于c++ - float 类型的默认参数 = 乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6533233/

相关文章:

未分配 C++ vector 值

c++ - 使用 C++ 和 winsock 的蓝牙

c++ - 使用 DEF 从 Visual Studio 2010 中的 DLL 导出函数

c# - 为什么在VS2010中添加服务引用时,没有生成客户端类?

c++ - 使用 auto、decltype、= 、[ ] 声明函数

C++17 检查有效表达式

c - 使用malloc两次后为"A heap has been corrupted"

asp.net-mvc - MVC T4 MvcTextTemplateHost 和自定义 "Controller"T4 模板

c++ - 默认的Visual Studio C++控制台应用程序有409个错误

c++ - 一个库中的函数调用另一个库中重写的delete[]