このエラーに関する投稿をたくさん見つけましたが、それを克服する方法を見つけることができました。これは、エラーがトリガーされるコードです。
void main(){
float f{1.3};
}
初期化リストで他の変数のようにキャストが行われなかったのはなぜですか?たとえば、これはスムーズに機能します。
float f = 1.3;
1.3
を使用すると、コンパイラでエラーが発生するというコメントがありました。これは、コンパイラのバグを見つけたことを意味します。この規格は、これが狭義の変換ではないことを明確に示しているため、許可する必要があります。
N4140(おおよそC++ 14)の引用:
8.5.4リスト初期化[dcl.init.list]
7 Aナロー変換は暗黙の変換です
[...]
7.2)
long double
からdouble
またはfloat
へ、またはdouble
からfloat
へ---(ソースがある場合を除く)は定数式であり、変換後の実際の値は、表現できる値の範囲内です(正確に表現できない場合でも)、または[...]
1.3
は、float
の範囲内にある定数式です。
まだ既知の問題ではないと想定して、これをMicrosoftに報告することをお勧めします。残念ながら、VisualStudioをアップグレードするだけではこれは修正されません。 VS2015で問題を再現できます。
'f'サフィックスを使用して強制的にフロートにすることで、ナローイング変換を回避できます。以下の作品..
float f{1.3f}
しかし、私はコンパイラがそれを処理するべきだったことに同意します..(@ hvdによって引用された標準に従って)
C++なので、cスタイルのキャストは使用しないでください。次のことを試してください。
static_cast<float>(std::abs(...))
これはおそらくバグか何かです。代わりにこれを使用してください:
float f;
f=1.3;