C++ 为什么std::num\u put通过非常量引用获取ios\u基参数?

C++ 为什么std::num\u put通过非常量引用获取ios\u基参数?,c++,formatting,iostream,facet,const-correctness,C++,Formatting,Iostream,Facet,Const Correctness,我正在试验iostreams/locale数字方面,我发现了一些非常奇怪的东西: 使用直接格式化数字的“规范示例”如下所示: std::string f(double value) { using namespace std; stringstream ss; num_put<char> const& npf = use_facet<num_put<char> >(ss.getloc()); npf.put(/*out=

我正在试验iostreams/locale数字方面,我发现了一些非常奇怪的东西:

使用直接格式化数字的“规范示例”如下所示:

std::string f(double value) {
    using namespace std;
    stringstream ss;
    num_put<char> const& npf = use_facet<num_put<char> >(ss.getloc());
    npf.put(/*out=*/ss, /*format=*/ss, /*fill=*/' ', value);
    return ss.str();
}
第二个参数to
put()
是一个流对象,用于确定要应用的特定格式。第二个参数根本没有修改。(不在我的实现中,也不符合此参数的用途。)

但是,
put
的签名如下所示:

iter类型输出(iter类型输出,std::ios\u基&str,字符类型填充,长 双v)常数

也就是说,它通过非常量引用获取ios_基本对象,即使它看起来应该通过const引用获取它

我错过什么了吗?这只是C++(iOnStand)规范中的(历史的)特性吗?这是否曾经被C++ STD委员会讨论过?

< P>(22.4.2.2.2),<代码> PUT/EXC>的执行是这样的:

第三阶段:

如果
str.width()<代码>str.width(0)
被调用`

另外,
str.width(0)
调用
width
声明而不使用
const
(请参阅):


@0x499602D2
getLoc
带有常量,但是在vs2013的实现中调用了函数
width(0)
,该函数是非常量const@Raxvan你能告诉我它在哪里吗?@0x499602D2@Raxvan Strange。上没有常量。@0x499602D2:),有趣的发现
std::string g(double value) {
    using namespace std;
    stringstream ss;
    typedef char* CharBufOutIt;
    num_put<char, CharBufOutIt> const& npf = use_facet<num_put<char, CharBufOutIt> >(ss.getloc());
    char big_enough_buf[100];
    npf.put(/*out=*/big_enough_buf, /*format=*/ss, /*fill=*/' ', value);
    return big_enough_buf;
}
streamsize ios_base::width (streamsize wide);