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.
因此在某种程度上,缩小也会增加类型安全性.