列表初始化即使用{}初始化,可在编译时自动识别数据窄化转换(收缩转换)。
窄化转换(收缩转换):窄化(收缩)转换是指将一个较大范围的数据类型转换为较小范围的数据类型,而可能导致数据丢失或精度降低的转换。列表初始化在很多情况下可以防止这种窄化转换的发生,从而增强了程序的安全性。
例如:
int num1 = 3.14; // 这里会将 double 类型的 3.14 窄化转换为 int 类型,结果 num1 的值为 3
int num2{3.14}; // 编译时报错,因为存在从 double 到 int 的窄化转换
通过这种方式,列表初始化可以在编译阶段就发现潜在的数据丢失问题,帮助开发者编写出更健壮的代码。
特别地,在使用auto关键字时使用=初始化更好。
例如,当使用auto
推断一个内置类型时,使用{}
初始化可能会被视为创建一个包含单个元素的初始化列表,而不是将该元素的值赋给变量。例如auto x = 5;
会正确地将x
推断为int
类型并赋值为 5。但如果写成auto x{5};
,在一些编译器中可能会将x
推断为std::initializer_list<int>
类型
{}空初始化列表时使用默认值进行初始化,例如int型默认为0,double型默认为0.0,指针默认为nullptr(空指针)。