为什么 std::boolalpha 使用 clang 时忽略字段宽度?
Why does std::boolalpha ignore field width when using clang?
以下代码给出了 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 set
N4582 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 代表图书馆工作组。
以下代码给出了 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 代表图书馆工作组。