在std::setfill
的参考页面上,有一个类似于以下程序的示例:
#include <iostream>
#include <iomanip>
int main()
{
std::cout << std::setfill('*') << std::setw(10) << 42 << 'n';
}
声称它应该打印:
********42
这表明填充字符的默认位置就像使用了std::right
操纵器一样。
标准是否保证这是行为,还是我需要指定std::right
才能确定?
另外,这是否仅适用于std::cout
,或者对于任何输出流都是一样的?
setfill
在[std.manip] 中定义为
template<class charT, class traits>
void f(basic_ios<charT, traits>& str, charT c) {
// set fill character
str.fill(c);
}
因此,我们需要看看ostream
的fill
函数会发生什么,这在[ostream.formatted.reqmts]/3中有详细说明。
如果流 os 的格式化输出函数确定填充,则按如下方式执行此操作。给定一个
charT
字符序列 seq,其中charT
是流的字符类型,如果 seq 的长度小于os.width()
,则根据需要向此序列添加足够的os.fill()
副本,以填充到os.width()
个字符的宽度。如果(os.flags() & ios_base::adjustfield) == ios_base::left
true
,则填充字符放在字符序列之后;否则,它们将放在字符序列之前。
因此,除非指定left
,否则填充字符排在第一位。 默认情况下,left
不是cout
的设置标志,表 122 中有详细说明: basic_ios::init(( 效果 [tab:basic.ios.cons]