float
to double
per [conv.fpprom]の「浮動小数点昇格」というものがあります。
type の prvalue は、 type のfloat
prvalue に変換できますdouble
。値は変更されません。
この変換は、浮動小数点昇格と呼ばれます。
リンクされた質問への回答は正しいです。float
通常の算術変換では浮動小数点オペランドがプロモートされないため、2 つの を追加するときにこのプロモートが自動的に行われることはありません。
のように、 a をオペランドとして省略記号に渡すと、浮動小数点の昇格が発生します。そのため、フォーマット指定子は aまたは aを出力します。 aを渡すと、関数は実際に昇格の結果である a を受け取ります。float
printf
%f
float
double
float
double
整数昇格と浮動小数点昇格は、整数変換、浮動小数点変換、および浮動小数点整数変換よりも暗黙的な変換ランクが高いため、浮動小数点昇格の存在はオーバーロードの解決においても重要です。
例 1:
void f(double);
void f(long double);
f(0.0f);
void f(double)
への昇格は へdouble
の変換よりも優れているため、これが呼び出されlong double
ます。対照的に、次の驚くべき例 2 を考えてみましょう。
void f(long double);
void f(int);
f(0.0f);
これはあいまいです。からfloat
への変換は、どちらもプロモーションではないため、からへlong double
の変換よりも優れているわけではありません。float
int
例 3:
struct S {
operator float();
operator int();
};
double d = S();
これは、呼び出して、結果の値を initializeにoperator float
プロモートします。float
double
d