g++
with-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 指出了定义为什么这样的标准(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.
我希望我刚刚介绍的示例将帮助其他人在使用初始化列表时克服一些狭窄的问题。
如果有人知道为什么最后一个案例违反了标准定义,请发表评论。