为什么此代码中没有缩小转换,导致错误?

时间:2013-03-08 15:14:21

标签: c++ c++11

带有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指向标准(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.

我希望我刚才介绍的示例可以帮助其他人在使用初始化列表时解决一些缩小的问题。

如果有人知道为什么最后一个案例违反了标准定义,请发表评论。

2 个答案:

答案 0 :(得分:10)

规则在8.5.4 p7中,不包括你的例子

  

从整数类型或未范围的枚举类型到浮点   type,除了源是常量表达式和实际值   转换后的值将适合目标类型并将生成   转换回原始类型时的原始值,或......

(强调我的)

答案 1 :(得分:7)

鉴于所有三个整数都可以精确地表示为float,我不明白为什么会出错。

那就是说,如果我包含一个不适合g++的常量,我可以float给我一个警告:

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