看起来这只是标准规范中的疏忽。
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));
}
编辑:显然它被提交修复并且没有达成共识(关闭为非缺陷)。