为什么std::to_string没有短重载?为什么没有noexcept?

10

有人知道为什么C++11标准第21.5节声明的各种to_string函数缺少短整型和无符号短整型的重载吗?为什么这些函数没有声明为noexcept?下面是所有的重载:

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

我查看了导致这些函数被采用的提案(N1803、N1982、N2408),但它们都没有任何动机或理由。

如果我在单个帖子中提出了两个问题(而且它们相当相关,依我看),是否违反了协议,我很抱歉。我还是 SO 的新手。

2个回答

13

异常: std::string没有noexcept构造函数,所以这是不可能的(即字符串内存分配可能会失败)。

短整型: 所有默认提升的整数类型都缺失;我想支持它们并没有什么好处。相比之下,较长的类型可能更昂贵,因此对于空间敏感的情况应该提供int


那不是会考虑性能(运行时)吗?毕竟,虽然转换可能更昂贵,但实际上没有必要存储更长的类型。 - Grizzly
@Grizzly:是的,使用不必要长的类型可能会影响空间和时间效率。 - Kerrek SB
int不仅是一个好东西,而且是必需的。将short传递到重载集中缺少int重载将会产生歧义(在非16位框上)。 - Johannes Schaub - litb
@JohannesSchaub-litb:我认为“你的计算机位数”不会影响整数提升的转换等级,对吗? - Kerrek SB
@kerr 不是指“短”(我道歉),而是指“无符号短整型”。如果它不能适应一个整型,那么提升为无符号整型。 - Johannes Schaub - litb
@JohannesSchaub-litb:我现在明白你的观点了。不过,我一直打算将我的论点同时适用于有符号类型和无符号类型,所以永远不会出现有符号转换的问题。 - Kerrek SB

4

这些函数都对传递给它们的值进行算术运算。比int小的类型在算术运算时会被提升为int(或unsigned int),因此使用比int小的类型版本并没有计算上的好处。(这些是通过我的提案引入的,所以我非常了解历史)


2
没有一些比int更小的类型是一个令人讨厌的特性,因为这会导致编译器警告。例如,在GCC上对无符号字符的to_string操作会产生"passing ‘unsigned char’ chooses ‘int’ over ‘unsigned int’ [-Werror=sign-promo]"的警告,这会导致大量的努力去抑制警告。还有,对于to_string(bool)怎么处理呢? - goneskiing
@goneskiing - GCC 抱怨的代码是有效的,其含义也是明确定义的。跟上编译器作者对良好编码风格的理解是一个无休止的挑战。 - Pete Becker
我也非常想知道@goneskiing问题的第二部分的答案,即为什么没有包括to_string(bool)。毕竟,许多指南建议不要使用布尔值的1/0表示(这是to_string的当前行为),并将其视为实现细节。因此,返回“true”或“false”可能是更合理的选择? - NOhs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接