8

Since switching on the C++0x standard in g++, I've started seeing 'narrowing conversion' errors, particularly when converting from an 'int' to a 'short' although I understand the error covers a much broader swath of conversions.

Can anyone shed some light on the rational for introducing this extra level of safety?, What are the possible consequences of disabling this error? (apart from the potential loss of precision).

Thanks.

4

1 回答 1

12

来自赋值和复合赋值运算符[expr.ass]

x={v} 的含义,其中 T 是表达式 x 的标量类型,是 x=T(v) 的含义,除了不允许缩小转换 (8.5.4)。

并来自List-initialization [dcl.ini.list]

如果需要缩小转换(见下文)来转换任何参数,则程序格式错误。

所以基本上你不能忽略它,你的程序在缩小转换的情况下格式不正确。

实施合规性

需要实现来诊断使用根据本国际标准格式错误的扩展的程序。然而,这样做之后,他们可以编译和执行这样的程序。

Bjarne Stroustroup

防止变窄

问题:C 和 C++ 隐式截断:

   诠释 x = 7.3; // 哎哟!
    无效 f(int);
    f(7.3);// 哎哟!

但是,在 C++0x 中,{} 初始化不会缩小:

int x0 {7.3};   // error: narrowing
int x1 = {7.3}; // error: narrowing
double d = 7;
int x2{d};      // error: narrowing (double to int)
char x3{7};     // ok: even though 7 is an int, this is not narrowing
vector<int> vi = { 1, 2.3, 4, 5.6 };    // error: double to int narrowing

C++0x 避免很多不兼容的方法是在决定什么是窄化转换时依赖初始化器的实际值(例如上面示例中的 7)(而不仅仅是类型)。如果一个值可以精确地表示为目标类型,则转换不会缩小。

char c1{7};      // OK: 7 is an int, but it fits in a char
char c2{77777};  // error: narrowing 

请注意,浮点到整数的转换总是被认为是缩小的——甚至是 7.0 到 7。

所以在某种程度上,变窄也增加了类型的安全性。

于 2011-12-20T17:18:20.223 回答