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
需要一个signedint
@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));
}