列表初始化
C++11 引入了列表初始化(List Initialization),使用 {} 语法。对于内置类型,int x{2}; 等价于 int x = 2;。
对于自定义类型,编译器会优先尝试直接构造。例如:
struct Date {
int year, month, day;
Date(int y, int m, int d) : year(y), month(m), day(d) {}
};
Date d1 = {2025, 11, 1}; // 直接构造,避免拷贝
Date d2{2025, 5, 28}; // 省略等号也是合法的
这里不会先构造临时对象再拷贝,而是直接用参数构造 d1,效率更高。
绑定引用初始化
当使用列表初始化绑定到引用时,需要注意生命周期。临时对象的生命周期通常只到语句结束,但绑定到 const 引用时会延长。
const Date& d3 = {2025, 12, 12}; // 合法,临时对象生命周期延长至 d3
// Date& d4 = {2025, 12, 12}; // 错误,非 const 引用不能绑定临时对象
如果不加 const,意味着允许修改该对象,但临时对象在下一行就会销毁,导致悬空引用风险。因此 const 引用不仅防止修改,还延长了临时对象的生存期。
注意:只有
{}初始化可以省略=,像Date d(2025);这种写法是构造函数调用,不是列表初始化。
左值与右值引用
左值和右值的本质区别在于是否可取地址。左值有名字、可寻址;右值通常是临时对象或字面量,不可寻址。
- 左值引用 (
&):给左值取别名,用于共享访问。 - 右值引用 (
&&):给右值取别名,用于转移资源所有权。
int a = 10;
int& lref = a; // 左值引用,a 是左值
int&& rref = ;
&& rref2 = a + ;


