The cppreference page on std::setbase
说:
除8,10或16之外的基数值将基址重置为零,这对应于十进制输出和前缀相关的输入。
怎么会?
有没有特别的理由为什么只支持这些基地?至少支持16到16(实际上,高达36:0-9,然后是a-z)的任何东西似乎微不足道,而不必做出任何困难的选择。具体来说,2是一个受欢迎的基础,我认为应该有std::setbase(2)
(和相应的std::binary
)的兴趣。
我显然可以打印自己的位,但对我的ostream来说这样做会很好。
唯一确定的答案是“因为标准这么说”。
话虽这么说,标准大多形式化了预标准的iostream实现,其中许多可能只是为了达到与printf
的功能奇偶校验,fmtflags
只支持十进制,八进制和十六进制(通过ad-hoc,非真正的一般语法) 。
此外,由于基本设置最终会进入位域,而不是单独的“当前基础”字段,因此现在修补iostream API以支持“很多”基数并不是一件容易的事。
现在,该标准要求std::bitset
具有一些“bitmask类型” - 甚至可能是fmtflags
,所以你可能会找到一种方法来铲除所有这些新的“基础”字段 - 但这是否值得努力(加上风险)打破代码,假设qazxswpoi是一个整体类型)几乎没有人真正关心的功能?
总而言之:糟糕的初始设计(实际上是iostream的其余部分),非常重要的修复,并没有真正的用户对此类功能的需求。