2013-03-08 65 views
5

g++-std=c++11似乎接受它:爲什麼在這段代碼中沒有縮小轉換,導致錯誤?

#include <vector> 
#include <initializer_list> 

std::vector<float> vf={1,2,3}; // Isn't this narrowing (i.e., an error)? 

int main() {} 

這似乎是有註釋的行應該報錯了,但事實並非如此。

更新

感謝Jesse用於指向定義爲什麼這是OK的standardese(8.5.4 P7)。下面是一些示例代碼,有助於澄清該標準中定義的行爲:

const int v5=5; 
int v6=6; 

vector<double> vd1={1,2,3,4};  // OK 
vector<double> vd2={1,2,3,4,v5}; // Still OK, v5 is const 
vector<double> vd3={1,2,3,4,v5,v6}; // Error, narrowing conversion, because v6 
            // is non-const 
vector<double> vd4={1,2,3,4,v5,static_cast<const int>(v6)}; // Also errors on 
            // gcc 4.7.2, not sure why. 

我希望我剛纔介紹的例子可以幫助其他使用初始化列表時,讓過去的一些狹窄的問題。

如果有人知道最後一例違反標準定義的原因,請發表評論。

+0

爲什麼你認爲它是縮小? – 2013-03-08 15:17:45

+3

縮小將從'float'變爲'int' – 2013-03-08 15:18:08

+0

該轉換如何縮小?當檢測到縮小時,GCC會[發出警告](http://liveworkspace.org/code/1FWK1L$2),並且可以通過[用'-pedantic-errors'編譯](http:// liveworkspace.org/code/1FWK1L$1)。 – Praetorian 2013-03-08 15:19:03

回答

10

的規則是在8.5.4 P7不包括你的榜樣

從整數型或無作用域枚舉類型到一個浮點 型,除非源是一個常量表達式和轉換後的實際 值將裝配到目標TY pe並將產生 的原始值轉換回原來的型號,或者......

(重點煤礦)

+0

好的發現和感謝您的參考。我不知道常量表達式的處理方式不同。 – 2013-03-08 15:21:20

+0

+1換句話說,不能有任何信息丟失 – 2013-03-08 17:26:27

+0

任何想法爲什麼我的最後一個例子產生縮小誤差? – 2013-03-08 21:07:29

7

我不明白爲什麼這應該錯誤,因爲所有三個整數可以完全表示爲float

這就是說,我可以得到g++給我一個警告,如果我有一個常數,它不適合在float

warning: narrowing conversion of '2112112112' from 'int' to 'float' inside { } [-Wnarrowing] 
相關問題