次のように、複数の型を含む式から推論する場合など、float/double 型の C++11 型推論の優先順位を管理する規則は何ですか。
auto var = float(1) * double(1);
次のように、複数の型を含む式から推論する場合など、float/double 型の C++11 型推論の優先順位を管理する規則は何ですか。
auto var = float(1) * double(1);
結果は になりますdouble
。これは と呼ばれfloating point promotion
ます。
標準、ISO 14882:2011、4.6 Floating point Promotion から:
1 float 型の prvalue は double 型の prvalue に変換できます。値は変更されません。
2 この変換は、浮動小数点昇格と呼ばれます。
@sftrabbit が指摘したように、新しい標準の5. Expressions、パラグラフ 9:
算術型または列挙型のオペランドを想定する多くの二項演算子は、同様の方法で変換を行い、結果の型を生成します。目的は、結果の型でもある共通の型を生成することです。
このパターンは通常の算術変換と呼ばれ、次のように定義されます。
— いずれかのオペランドがスコープ列挙型 (7.2) の場合、変換は実行されません。他のオペランドが同じ型でない場合、式は不適切な形式です。
— いずれかのオペランドが long double 型の場合、もう一方は long double に変換されます。
— それ以外の場合、どちらかのオペランドが double の場合、もう一方は double に変換されます。
— それ以外の場合、いずれかのオペランドが float の場合、もう一方は float に変換されます。
— それ以外の場合、整数昇格 (4.5) は両方のオペランドで実行されます。
型推論は新しいものを追加せず、'=' の右側の式がいつものように評価され、その型が 'auto' に使用されます。
'auto var' と 'auto & var' などの違いを見ると少し興味深いですが、それはあなたの質問ではありませんでした。
答えは、問題のタイプによって異なります。sizeof(double) >= sizeof(float)
あなたの特定の例では、標準は、結果の型double * float
が常にになることを保証しますdouble
。(これは C 言語から継承された規則であり、C から派生した他の多くの言語でも一般的に同じです)
キーワードで変数を初期化すると、auto
初期化の式の結果の型が決定されます - 関数の戻り値、計算、decltype などからのものかどうか。再利用。