为什么std::num_put通过非常量引用获取ios_base参数
Why does std::num_put take the ios_base parameter by non-const reference?
我正在尝试iostreams/locale数字方面,我发现了一些非常奇怪的东西:
使用std::num_put方面直接格式化数字的"规范示例"如下:
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();
}
put
的第一个参数是写入输出的对象。
我们也可以有这样的代码,它可以工作:
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;
}
put()
的第二个参数是一个流对象,用于确定要应用的特定格式。第二个参数是,根本没有修改。(在我的实现中没有,也没有根据文档描述的这个参数的用途。)
然而,put
的签名看起来是这样的:
iter_type put(iter_type out,std::ios_base&str,char_type-fill,long双v)const;
也就是说,它通过非常量引用获取ios_base对象,即使它看起来确实应该通过常量引用获取。
我是不是错过了什么?这只是C++iostreams规范中的一个(历史?)特性吗?C++标准委员会讨论过这个问题吗?
根据标准(22.4.2.2.2),put
的实施在一点上是这样的:
第3阶段:
如果
str.width()
为非零,并且阶段2之后的序列中的charT’s
的数量小于str.width()
,则在指示用于填充的位置处将足够的填充字符添加到序列,以使序列的长度达到str.width()
。调用str.width(0)
此外,str.width(0)
调用未声明const
的width
(请参阅此链接):
streamsize ios_base::width (streamsize wide);
相关文章:
- 具有默认值的引用获取函数
- 很好的语法来获取对向量/数组数据的大小引用?
- C++ 获取函数在常量引用中按值返回的结果
- 获取对function_name的未定义引用
- 重载运算符*以获取对另一个类的实例的引用
- 我可以从其变量中获取对类对象的引用吗?
- 如何通过引用获取引用变量的地址?
- 如何在函数参数中通过引用获取数组
- 为什么 std::find_if(first, last, p) 不通过引用获取谓词?
- boost::可选 - 对对象使用 boost::in_place,构造器通过引用获取其他对象
- 在常量引用获取器上读取写入互斥锁(使用 Qt)
- 使用const_cast const-ref getter 实现引用获取器的陷阱
- 如何避免意外地按值而不是按引用获取数组元素
- 从指针或引用获取迭代器
- 如何在visual c++内联汇编程序中通过引用获取值
- 将函数指针传递给一个函数,该函数通过引用获取另一个函数
- 为什么std::num_put通过非常量引用获取ios_base参数
- 为什么 std::make_pair 是按值而不是常量引用获取输入
- 是否可以通过常量引用获取参数,同时禁止转换,以便不传递临时变量?
- 基于范围的循环:通过值或对const的引用获取项