3

次のように、複数の型を含む式から推論する場合など、float/double 型の C++11 型推論の優先順位を管理する規則は何ですか。

auto var = float(1) * double(1);
4

3 に答える 3

8

結果は になります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) は両方のオペランドで実行されます。

于 2012-09-23T15:38:40.287 に答える
2

型推論は新しいものを追加せず、'=' の右側の式がいつものように評価され、その型が 'auto' に使用されます。

'auto var' と 'auto & var' などの違いを見ると少し興味深いですが、それはあなたの質問ではありませんでした。

于 2012-09-23T15:38:53.927 に答える
2

答えは、問題のタイプによって異なります。sizeof(double) >= sizeof(float)あなたの特定の例では、標準は、結果の型double * floatが常にになることを保証しますdouble。(これは C 言語から継承された規則であり、C から派生した他の多くの言語でも一般的に同じです)

キーワードで変数を初期化すると、auto初期化の式の結果の型が決定されます - 関数の戻り値、計算、decltype などからのものかどうか。再利用。

于 2012-09-23T15:39:03.300 に答える