Why does std :: boolalpha ignore field width when using clang?

The following code gives different results with the g ++ 7 compiler and Apple clang ++. Have I really encountered an error in setting the output of bool when using std::boolalpha , or did I make a mistake?

 #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; } 

The difference is as follows:

 // 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) 
+7
c ++ io c ++ 11 stringstream ostringstream
source share
1 answer

In TC, this is LWG 2703 :

There are no conditions to fill when boolalpha installed

N4582 subclause 25.4.2.2.2 [facet.num.put.virtuals], clause 6, does not provide for filling out the filling in its description of the behavior when (str.flags() & ios_base::boolalpha) != 0 .

As a result, I do not see a solution with Clang. However, note that:

  • libC ++ accurately implements this.
  • libstdC ++ and MSVC apply padding and alignment.

PS: LWG stands for library working group.

+4
source share

All Articles