在C ++ 11的标题中,有三个用于在数字和字符串之间进行转换的新函数。
std::string std::to_string(unsigned long long);
std::string std::to_string(long double);
std::string std::to_string(long long);
第一个问题 - 为什么只有3个功能?那么简单的int或unsigned int等呢?
第二个问题 - 为什么to_string不会在以下代码中抛出异常?
long double x = std::numeric_limits<long double>::quiet_NaN();
std::string i = std::to_string( x );
long double c = std::stold( i ); // i = "1.#QNAN"
第三个问题 - 为什么c等于1.0?
答案 0 :(得分:5)
“只要它产生所描述的行为,请按照自己的意愿行事...... ”
所有内在数字类型都可以隐式转换为unsigned long long
,long double
或long long
,并且仍然保持所需的精度,因此不再需要重载。
标准规定应该定义以下函数,但是确认标准的lib可以自由地执行“任何它想要的”,只要它产生与描述相同的行为。
为什么要抛出异常?
std::numeric_limits<long double>::quiet_NaN();
是一个有效值,标准中描述std::to_string (T)
以产生与使用相应的 format-string 调用sprintf
相同的行为。
§21.5 / 6 数字转换
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);
..
<强>返回:强>
- 每个函数返回一个包含该字符的字符串对象 表示将由其生成的参数的值 使用格式说明符“%d ”,“%u ”调用sprintf(buf,fmt,val), “%ld ”,“%lu ”,“%lld ”,“%llu ”,“< em>%f “,”%f “或”%Lf “, 其中buf指定足够大小的内部字符缓冲区。
什么编译器 c
等于1.0
?
如果NaN
的值是i
的字符串表示形式(不包含任何数字),则转换应生成NaN
- 值。
如果找不到合适的转换,则描述该函数抛出invalid_argument
。
1.#QNAN
转换为std::numeric_limits<long double>::quiet_NaN();
时, MSVC 将产生std::string
。
使用std::stold
时,它将查找第一个无空白字符,然后使用找到的数字(在这种情况下只有1
),因此c
将等于函数调用后1.0
。
答案 1 :(得分:1)
我在标准副本中找到了整个包:
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);
也许你的编译器还没有实现所有这些呢?
该功能描述为
返回:每个函数返回一个字符串对象,其中包含其参数值的字符表示形式,该字符表示形式将通过调用
sprintf(buf, fmt, val)
格式说明符"%d"
,"%u"
,{{}}生成。 {1}},"%ld"
,"%lu"
,"%lld"
,"%llu"
,"%f"
或"%f"
,分别位于"%Lf"
指定足够大小的内部字符缓冲区。
因为它应该是buf
的包装器,所以可能决定不抛出任何异常,因为sprintf
没有。