【发布时间】:2015-03-21 10:47:02
【问题描述】:
这个简单的代码
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,每个元素的宽度和精度等于当前值,允许类似的代码
some_array_type<double> x;
std::cout << std::setw(12) << std::setprecision(8) << x << std::endl;
但是,正如 clang 所指出的,ostream::width() 和 ostream::precision() (std::size_t) 返回的类型与操纵器 std::setw 和 std::setprecision (int) 接受的参数类型不同,因此上面的代码触发了两个警告。
这种不一致是否有特殊原因,或者这只是 C++ 标准中的一个小缺陷(或 libc++ 实现的错误)?
【问题讨论】: