7

是实现定义还是标准建议流的默认填充字符?

示例代码:

#include <iostream>
#include <iomanip>
#include <sstream>

int main ()
{
    std::stringstream stream;
    stream << std::setw( 10 ) << 25 << std::endl;

    std::cout << stream.str() << std::endl;
}

clang++ --stdlib=libstdc++

$ clang++ --stdlib=libstdc++ test.cpp
$ ./a.out | hexdump
0000000 20 20 20 20 20 20 20 20 32 35 0a 0a
000000c
$

clang++ --stdlib=libc++

$ clang++ --stdlib=libc++ test.cpp
$ ./a.out | hexdump
0000000 ff ff ff ff ff ff ff ff 32 35 0a 0a
000000c

版本

$ clang++ --version
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

我能够用 修复它std::setfill(' '),但很想知道它是否是一个clang错误。

4

1 回答 1

6

s流的默认填充字符s.widen(' ')根据 27.5.5.2 [basic.ios.cons] 第 3 段/表 128。s.widen(' ')但是,产生的字符取决于std::locale原样s.widen(c)(27.5.5.3 [basic.ios.members]第 12 段):

std::use_facet<std::ctype<cT>>(s.getloc()).widen(c)

顺便说一句,std::ostringstream当您只写入流并且没有std::endl使用时,您应该使用。

于 2013-12-27T01:35:06.260 回答