C++中以{}方式初始化时进行的转换(C++11)
C++11将使用大括号的初始化称为列表初始化(list-initialization),因为这种初始化常用于给复杂的数据类型提供值列表。与程序清单13.3所示的初始化方式相比,它对类型转换的要求更严格。具体地说,列表初始化不允许缩窄(narrowing),即变量的类型可能无法表示赋给它的值。例如,不允许将浮点型转换为整型。在不同的整型之间转换或将整型转换为浮点型可能被允许,条件是编译器知道目标变量能够正确地存储赋给它的值。例如,可将 1ong 变量初始化为 int值,因为1ong 总是至少与int 一样长;相反方向的转换也可能被允许,只要int变量能够存储赋给它的long常量:
const int code=66;
int x=66;
char cl{31325};// narrowing,not allowed
char c2 = {66};// allowed because char can hold 66
char c3 {code}; // ditto
char c4 = {x}; // not allowed,x is not constant
x= 31325;
char c5=x; //allowed by this form of initialization
在上述代码中,初始化 c4时,您知道x的值为66,但在编译器看来,x是一个变量,其值可能很大。
编译器不会跟踪下述阶段可能发生的情况:从x被初始化到它被用来初始化c4。
对C++感兴趣的朋友点这里:C/C++课程