这个简单的代码
template<typename T>
std::ostream&operator<<(std::ostream&s, some_array_type<T> const&x)
{
auto w = s.width();
auto p = s.precision();
s << x[0];
for(std::size_t i=1; i!=x.size(); ++i)
s << ' ' << std::setw(w) << std::setprecision(p) << m[i];
return s;
}
打算打印some_array_type
每个元素的宽度和精度等于当前值的 a,允许类似的代码
some_array_type<double> x;
std::cout << std::setw(12) << std::setprecision(8) << x << std::endl;
但是,正如 clang 所指出的,and () 返回的ostream::width()
类型ostream::precision()
与操纵器和( )std::size_t
接受的参数类型不同,因此上面的代码会触发两个警告。std::setw
std::setprecision
int
这种不一致是否有特殊原因,或者这只是 C++ 标准中的一个小缺陷(或 libc++ 实现的错误)?