標準仕様の単なる見落としのようです。
ios_base::precision
1 つは精度を取得し、もう 1 つは精度を設定します。
// 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));
}
編集:どうやら修正するために提出され、コンセンサスに達しませんでした(非欠陥として閉じられました)。