C++ 为什么std::to_字符串没有短重载?为什么没有例外?

C++ 为什么std::to_字符串没有短重载?为什么没有例外?,c++,c++11,C++,C++11,有人知道为什么C++11标准第21.5节中声明的各种to_string函数缺少short和unsigned short的重载吗?为什么不声明这些函数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); s

有人知道为什么C++11标准第21.5节中声明的各种
to_string
函数缺少short和unsigned short的重载吗?为什么不声明这些函数
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),但没有一个提案有任何动机或理由


如果我在一篇文章中提出两个(相当相关,IMO)问题违反了协议,我道歉。我在SO还是新手。

异常:对于
std::string
,没有
noexcept
构造函数,因此这是不可能的(即字符串内存分配可能失败)


短路:缺少所有默认升级的整数类型;我想支持他们不会有什么好处。相比之下,较长的类型可能更昂贵,因此应为空间意识的用户提供
int

这些函数都对传递给它们的值进行算术运算。对于算术,小于int的类型被提升为int(或无符号int),因此使用小于int的类型的版本在计算上没有任何好处(这些是通过我的建议而来的,所以我非常了解历史)

这不是性能(如在运行时)意识吗?毕竟,虽然转换可能更昂贵,但实际上不需要存储更长的类型。@Grizzly:是的,使用不必要的长类型可能会影响空间和时间效率。int不仅是一件好事,而且是必需的。向缺少int重载的重载集传递一个short将产生歧义(在非16位的盒子上)。@johanneschaub litb:我认为“你盒子的比特数”不会影响整数提升的转换等级,是吗?@kerr不是指short(我很抱歉),而是指unsigned short。如果它不适合int,则升级为unsigned int。没有小于int的某些类型的一个恼人特性是编译器警告。例如,对于GCC上未签名字符的字符串,给出了“传递‘unsigned char’时选择‘int’而不是‘unsigned int’[-Werror=sign promo]”,这会导致大量的努力,从而产生压力警告。另外,关于_string(bool)@goneskiing,GCC抱怨的代码是有效的,其含义定义良好。要跟上编译器编写者关于良好编码风格的观念是一个漫长的过程。对于@goneskiing的问题的第二部分的答案,我也非常感兴趣,关于为什么不包括
to_string(bool)
。毕竟,许多指南建议不要使用bools的1/0表示(这是
to_string
的当前行为),并将其视为实现细节。因此,我想返回“真”或“假”会是一个更合理的选择吗?