8

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

"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);
}

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

4

1 回答 1

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()函数只需要一个普通的 old int

unspecified-type setprecision(int n);

并返回一个未指定的函子,当它被流使用时,str具有以下效果:

str.precision(n);

在你的情况下,streamsize不是int(也不一定是),因此是警告。可能应该更改标准,以便setprecision's 参数不是int,但是streamsize

您可以precison()像上面那样只调用自己,或者假设int足够并强制转换。

#include <iomanip>
#include <iostream>

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

编辑:显然它被提交修复并且没有达成共识(关闭为非缺陷)

于 2012-07-27T23:19:46.060 回答