web-dev-qa-db-ja.com

エラー83エラーC2398:「double」から「float」への変換には絞り込み変換が必要です

このエラーに関する投稿をたくさん見つけましたが、それを克服する方法を見つけることができました。これは、エラーがトリガーされるコードです。

void main(){
    float f{1.3};
}

初期化リストで他の変数のようにキャストが行われなかったのはなぜですか?たとえば、これはスムーズに機能します。

float f = 1.3;
9
Humam Helfawi

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で問題を再現できます。

12
user743382

'f'サフィックスを使用して強制的にフロートにすることで、ナローイング変換を回避できます。以下の作品..

float f{1.3f}

しかし、私はコンパイラがそれを処理するべきだったことに同意します..(@ hvdによって引用された標準に従って)

C++なので、cスタイルのキャストは使用しないでください。次のことを試してください。

 static_cast<float>(std::abs(...))
0
CJCombrink

これはおそらくバグか何かです。代わりにこれを使用してください:

float f;
f=1.3;
0
user7695214