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.
我希望我剛纔介紹的例子可以幫助其他使用初始化列表時,讓過去的一些狹窄的問題。
如果有人知道最後一例違反標準定義的原因,請發表評論。
爲什麼你認爲它是縮小? – 2013-03-08 15:17:45
縮小將從'float'變爲'int' – 2013-03-08 15:18:08
該轉換如何縮小?當檢測到縮小時,GCC會[發出警告](http://liveworkspace.org/code/1FWK1L$2),並且可以通過[用'-pedantic-errors'編譯](http:// liveworkspace.org/code/1FWK1L$1)。 – Praetorian 2013-03-08 15:19:03