5

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.

我希望我刚刚介绍的示例将帮助其他人在使用初始化列表时克服一些狭窄的问题。

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

4

2 回答 2

10

规则在 8.5.4 p7 中,不包括您的示例

从整数类型或无作用域枚举类型到浮点类型,除非源是常量表达式并且转换后的实际值将适合目标类型并且在转换回原始类型时将产生原始值,或…

(强调我的)

于 2013-03-08T15:18:51.010 回答
7

我不明白为什么这会出错,因为所有三个整数都可以精确表示为float.

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

warning: narrowing conversion of '2112112112' from 'int' to 'float' inside { } [-Wnarrowing]
于 2013-03-08T15:18:09.713 回答