gpt4 book ai didi

c++ - 为什么编译器会警告 setprecision 中的隐式转换?

转载 作者:可可西里 更新时间:2023-11-01 17:38:19 27 4
gpt4 key购买 nike

当我编译下面的代码时,编译器给我警告:

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

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

最佳答案

看起来这只是标准规范中的一个疏忽。

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) .

关于c++ - 为什么编译器会警告 setprecision 中的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11696739/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com