Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么编译器会警告setprecision中的隐式转换?_C++ - Fatal编程技术网

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

C++ 为什么编译器会警告setprecision中的隐式转换?,c++,C++,编译以下代码时,编译器会向我发出警告: "Implicit conversion loses integer precision: 'std::streamsize' (aka 'long') to 'int'". 我对这个警告有点困惑,因为我只是试图保存精度的当前值,以便稍后将其设置回原始值 #include <iomanip> #include <iostream> int main() { std::streamsize prec = std::cout.

编译以下代码时,编译器会向我发出警告:

"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);
}
#包括
#包括
int main(){
std::streamsize prec=std::cout.precision();

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

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
}
并返回一个未指定的函子,该函子在被流
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));
}
#包括
#包括
int main(){
std::streamsize prec=std::cout.precision();

std::cout你在使用哪种编译器?我在
g++-O3-Wall-Wextra-Werror-pedantic
什么编译器上没有收到任何警告或错误?我认为你的实现上的
std::streamsize
signed long
,而
setprecision
需要一个signed
int
@Prashant:这一定是clang,Visual Studio,Borland、Intel C等。这就是为什么C++11重新引入了
auto
关键字,用于从表达式中自动推断变量的类型。否则,您的代码在我看来是正确的……我在使用具有相同编译器标志的
clang++
时也没有收到警告或错误,但我的是
Apple clang 2.1版(tags/Apple/clang-163.7.1)(基于LLVM 3.0svn)
#include <iomanip>
#include <iostream>

int main() {
  std::streamsize prec = std::cout.precision();
  std::cout << std::setprecision(static_cast<int>(prec));
}