为什么编译器会在setprecision中警告隐式转换?

时间:2012-07-27 23:06:54

标签: c++

当我编译以下代码时,编译器会给我警告:

"Implicit conversion loses integer precision: 'std::streamsize' (aka 'long') to 'int'". 

我对此警告有点困惑,因为我只是想保存精度的当前值,以便稍后将其设置回原始值。

#include <iomanip>
#include <iostream>

int main() {
  std::streamsize prec = std::cout.precision();
  std::cout << std::setprecision(prec);
}

在这种情况下保存精度值并将其设置回来的正确方法是什么?

1 个答案:

答案 0 :(得分:11)

看起来它只是标准规范的疏忽。

ios_base::precision有两个重载,一个获取,一个设置精度:

// returns current precision
streamsize precision() const;

// sets current precision and returns old value
streamsize precision(streamsize prec) const;

所以这段代码不会给你警告:

#include <iostream>

int main() {
  std::streamsize prec = std::cout.precision(); // gets
  std::cout.precision(prec); // sets
}

但是,setprecision()函数只需要一个普通的int

unspecified-type setprecision(int n);

并返回一个未指定的仿函数,该函数在由流str使用时具有以下效果:

str.precision(n);

在您的情况下,streamsize不是int(并且不一定是),因此警告。可能应该更改标准,以使setprecision的参数不是int,而是streamsize

如上所述,您可以自己致电precison(),也可以假设int已足够并投出。

#include <iomanip>
#include <iostream>

int main() {
  std::streamsize prec = std::cout.precision();
  std::cout << std::setprecision(static_cast<int>(prec));
}

修改:Apparently it was submitted to be fixed and reached no concensus (closed as not-a-defect)