【问题标题】:Why compiler warns about implicit conversion in setprecision?为什么编译器会警告 setprecision 中的隐式转换?
【发布时间】:2012-07-27 23:06:54
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用的是哪个编译器?我没有收到 g++ -O3 -Wall -Wextra -Werror -pedantic 的警告或错误
  • 什么编译器?我认为你的实现中的std::streamsizesigned long,而setprecision 需要一个签名的int
  • @Prashant:肯定是cla​​ng、Visual Studio、Borland、Intel C等。
  • 正是 C++11 重新引入 auto 关键字以从表达式中自动推断变量类型的原因。否则你的代码对我来说看起来是正确的......
  • 在使用具有相同编译器标志的clang++ 时,我也没有收到任何警告或错误,但我的是Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)

标签: c++


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多