当我编译以下代码时,编译器会给我警告:
"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);
}
在这种情况下保存精度值并将其设置回来的正确方法是什么?
答案 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)。