什么可以在NaN情况下返回to_string()

NoS*_*tAl 3 c++ visual-c++ c++11

我使用VS 2012,我遇到了非常恼人的行为(有时我的浮动是NaN):

auto dbgHelp = std::to_string(myFloat);
Run Code Online (Sandbox Code Playgroud)

dbgHelp最终包含5008个字符(你不能发明这些东西)大部分都是0,它最终得到:0.#INF00

那么这个bug或标准是否允许像这样的白痴返回值?

修复是微不足道的,因为我可以用三元运算符来制作正确的thig,isnan() 但我想知道标准是否具体对此...

Cas*_*sey 5

std::to_string过载值被在[string.conversions]/7指定的:

string to_string(int val);
string to_string(unsigned val);
string to_string(long val);
string to_string(unsigned long val);
string to_string(long long val);
string to_string(unsigned long long val);
string to_string(float val);
string to_string(double val);
string to_string(long double val);
Run Code Online (Sandbox Code Playgroud)

7 返回:每个函数返回一个string保持,将通过调用来产生其自变量的值的字符表示对象sprintf(buf, fmt, val)与一个格式说明"%d","%u","%ld","%lu","%lld","%llu","%f","%f",或"%Lf",分别,其中buf指定足够大小的内部字符缓冲区.

sprintf 在C99(实际上是N1256)7.19.6.6/2中有详细说明:

sprintf函数等效于fprintf,除了输出被写入数组(由参数指定s)而不是流.在写入的字符末尾写入空字符; 它不计入返回值的一部分.如果在重叠的对象之间进行复制,则行为未定义.

跳到7.19.6.1 for fprintf,格式标志在第8段中描述.具体来说,对于f格式:

double表示浮点数参数被转换为十进制表示在样式[ - ] ddd.ddd,其中的小数点字符后的数字位数等于指定的精度.如果缺少精度,则取6; 如果精度为零且未指定#flag,则不显示小数点字符.如果出现小数点字符,则在其前面至少出现一个数字.该值四舍五入到适当的位数.

double表示无穷大的参数在其中一个样式中转换 [-]inf[-]infinity- 哪个样式是实现定义的.表示NaN的双参数在其中一个样式 [-]nan[-]nan(n-char-sequence中转换) - 哪个样式和任何n-char序列的含义是实现定义的.的F转换指定产生INF,INFINITYNAN代替的inf,infinitynan分别.

把它们放在一起,什么时候float foo是正无穷大,std::to_string(foo)应该回归std::string("inf").