忽略C++ 0x中缩小转换的后果是什么?

Gea*_*phy 7 c++ g++ narrowing c++11

自从用g ++打开C++ 0x标准后,我开始看到'缩小转换'错误,特别是在从'int'转换为'short'时,尽管我理解错误涵盖了更广泛的转换.

任何人都可以对引入这种额外安全级别的理性有所了解吗?禁用此错误会产生什么后果?(除了潜在的精度损失).

谢谢.

Seb*_*ach 12

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

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

列表初始化[dcl.ini.list]

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

所以基本上你不能忽视它,你的程序在变窄的转换中是不正确的.

实施合规性:

需要实现来诊断使用根据本国际标准格式不正确的扩展的程序.但是,这样做之后,他们就可以编译和执行这样的程序.

Bjarne的Stroustroup说这个:

防止缩小范围

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

   int x = 7.3;        // Ouch!
    void f(int);
    f(7.3);         // Ouch!

但是,在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
Run Code Online (Sandbox Code Playgroud)

C++ 0x避免大量不兼容的方式是在决定什么是缩小转换时,依赖于初始化器的实际值(例如上面示例中的7),它可以(而不仅仅是键入).如果值可以完全表示为目标类型,则转换不会缩小.

char c1{7};      // OK: 7 is an int, but it fits in a char
char c2{77777};  // error: narrowing 
Run Code Online (Sandbox Code Playgroud)

请注意,浮点到整数转换始终被视为缩小 - 甚至是7.0到7.

因此在某种程度上,缩小也会增加类型安全性.