为什么到目前为止,C++中还没有明确包含整数到字符串的转换



我在学习C++时遇到的第一个问题是,itoa函数在一些编译器上得到支持,但实际上并没有在ANSI-C标准中定义(因此通常被认为是不好使用的做法)。

我见过多种解决方案,比如使用stringstreamsnprintf,这对我来说一直很迂回,最后在C++11中有了std::to_string,从语言的角度来看,它感觉更干净。

但是,为什么花了这么长时间才添加一种更直接的方法呢?除了一些关于效率的讨论之外,我很难找到任何东西,也没有在没有充分理由的情况下改变标准的愿望。有没有正式说明过为什么不包括它,或者为什么他们最终决定在C++11中添加它?有没有讨论过将其添加到C的未来版本中?

事后看来,这是一个疏忽。然而,在不了解C++开发历史的细节的情况下,我大胆猜测这种疏忽有充分的理由,植根于理论。请看,从数字到字符串以及从字符串到数字的转换绝非易事,而且它不太符合"强制转换"的正常定义(实际上,它需要解析器/格式化程序),尽管大多数其他语言都提供了这样的强制转换。

除此之外,C++对字符串类型的支持相当……平淡无奇。C甚至没有一个真正的专用类型,而是使用char数组。C++稍微,但在没有适当的内置字符串支持的情况下停止了。这可以从许多方面看出,从字符串文字仍然是一个以null结尾的char数组,到std::string有一个臃肿、设计糟糕的接口的广泛共识。别忘了std::string甚至不代表字符串!它代表一个字节数组!这是一个重要的区别,原因很简单,因为std::string完全是编码不可知论者。

啊,但C++实际上确实支持正确的编码、正确的解析和格式化。它只是不为字符串提供它,而是为提供它。

C++没有合适的字符串类型。相反,它有输入/输出流。

据我所知,这只是一个问题,你希望有多少种方法可以将整数转换为以10为基数的数字。C++从C(sprintf)继承了一个,并添加了一个自己的operator<<(ostream &, int)。这两个都比新的to_string更可配置,所以我怀疑在C++98/03的时候并没有出现它们不足的情况。

2003年至2011年间,C++标准没有正式更改(一些公认的勘误表,仅此而已),所以它花了这么长时间的另一部分原因是C++0x花了这么久时间,这是因为与to_string无关的原因。CCD_ 14在一定程度上填补了这一空白。

最新更新