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