cppreference 页面位于std::setbase http://en.cppreference.com/w/cpp/io/manip/setbase says:
除 8、10 或 16 之外的基值会将基域重置为零,这对应于十进制输出和依赖于前缀的输入。
怎么会?
仅支持这些基地是否有特殊原因?至少支持 16 以内的任何内容(实际上,最多 36:0-9,然后是 a-z),而不必做出任何困难的选择,这似乎是微不足道的。具体来说,2是一个受欢迎的基地,我认为应该有兴趣std::setbase(2)
(以及相应的std::binary
).
显然我可以打印我自己的位,但如果我的 ostream 能这样做就更好了。
唯一确定的答案是“因为标准是这么说的”。
话虽这么说,该标准主要形式化了标准前的 iostream 实现,其中许多可能只是为了达到与printf
,仅支持十进制、八进制和十六进制(通过临时的、非通用的语法)。
另外,现在修补 iostream API 以支持“许多”基数并不是一件容易的事,因为基数设置最终会进入一个位字段,而不是一个单独的“当前基数”字段。
现在,标准要求fmtflags
是某种“位掩码类型” - 甚至可能是std::bitset
,所以你可能会找到一种方法来以某种方式铲除所有这些新的“基本”字段 - 但这真的值得付出努力吗(加上破坏假设的代码的风险fmtflags
是一个整体类型)对于一个几乎没有人真正关心的功能?
所以,总结一下:糟糕的初始设计(实际上就像 iostream 的其余部分一样)、不平凡的修复以及对此类功能没有真正的用户需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)