以下代码使用g 7编译器和Apple clang给出了不同的结果.当使用std :: boolalpha时,我是否遇到了bool输出对齐中的clang错误,或者我犯了错误?
#include <string> #include <sstream> #include <iostream> #include <iomanip> template<typename T> void print_item(std::string name,T& item) { std::ostringstream ss; ss << std::left << std::setw(30) << name << "= " << std::right << std::setw(11) << std::setprecision(5) << std::boolalpha << item << " (blabla)" << std::endl; std::cout << ss.str(); } int main() { int i = 34; std::string s = "Hello!"; double d = 2.; bool b = true; print_item("i",i); print_item("s",s); print_item("d",d); print_item("b",b); return 0; }
不同之处是:
// output from g++ version 7.2 i = 34 (blabla) s = Hello! (blabla) d = 2 (blabla) b = true (blabla) // output from Apple clang++ 8.0.0 i = 34 (blabla) s = Hello! (blabla) d = 2 (blabla) b = true (blabla)
解决方法
在T.C.提到,这是
LWG 2703:
No provision for fill-padding when
boolalpha
is setN4582 subclause 25.4.2.2.2 [facet.num.put.virtuals] paragraph 6 makes
no provision for fill-padding in its specification of the behavIoUr
when(str.flags() & ios_base::boolalpha) != 0
.
结果我没有看到与Clang的解决方案.但请注意:
> libc完全实现了这一点.
> libstdc和MSVC应用填充和对齐.
PS:LWG代表图书馆工作组.