什麼是管理在C++ 11類型推斷浮法/雙類型的優先級,例如,從一個表達式推斷含有多種類型的,像這樣當規則:在C++ 11類型推斷期間管理優先級的規則是什麼?
auto var = float(1) * double(1);
什麼是管理在C++ 11類型推斷浮法/雙類型的優先級,例如,從一個表達式推斷含有多種類型的,像這樣當規則:在C++ 11類型推斷期間管理優先級的規則是什麼?
auto var = float(1) * double(1);
其結果將是一個double
。這被稱爲floating point promotion
。
從標準,ISO 14882:2011,4.6浮點促進:
1型浮動的prvalue可以轉換爲double類型的prvalue。價值不變。
2此轉換稱爲浮點升級。
正如@sftrabbit指出的,在5.表達式,第9段中的新的標準:
許多二進制運算符期望的算術或枚舉類型原因轉換和產量的操作數結果類型以類似的方式。目的是產生一個共同的類型,這也是結果的類型。
此模式如下稱爲通常的算術轉換,其被定義爲:
- 如果一個操作數的範圍的枚舉類型(7.2)的,不會進行任何轉換;如果另一個操作數不具有相同的類型,則該表達式不合格。
- 如果任一操作數的類型爲long double,則另一個操作數應轉換爲long double。
- 否則,如果任一操作數爲雙倍,則另一個應轉換爲雙倍。
- 否則,如果其中一個操作數是float,另一個應轉換爲float。
- 否則,積分促銷(4.5)應在兩個操作數上執行。
§5/ 10說「否則,如果其中一個操作數是雙倍的,另一個應轉換爲雙倍。」 –
@sftrabbit - 這就是我一直在尋找:)我會編輯添加這個報價。 –
類型推斷不會添加任何新的東西,'='右邊的表達式會被一直評估,然後它的類型將被用於'auto'。
當您查看'auto var'和'auto & var'之間的差異以及類似情況時,它會稍微有趣些,但這不是您的問題。
答案取決於有問題的類型。在您的具體示例中,標準保證sizeof(double) >= sizeof(float)
因此生成的double * float
類型將始終爲double
。 (這是繼承自C語言的規則,並且在衍生自C的許多其他語言中通常是相同的)
當使用auto
關鍵字初始化變量時,會確定初始化表達式的結果類型 - 無論它來自函數返回,計算,decltype等。類型取決於您正在使用的類型可用的隱式和顯式轉換。
確實包含多種類型,但* *只有一種類型:'double'。 – 2012-09-23 15:38:02