带大括号初始化的vector常量引用参数为何可行?
为什么const左值引用能绑定初始化列表?
你提到的核心点没错:普通非const左值引用确实只能绑定到有内存地址的左值,但const修饰的左值引用是C++里的特殊情况——它允许绑定到临时对象(右值),这是标准特意设计的规则,目的是兼顾效率和代码便利性。
具体到你的代码,执行过程是这样的:
- 调用
func({1})时,编译器会先用初始化列表{1}构造一个临时的vector<int>对象,这个临时对象属于右值。 const vector<int>&这种const左值引用,会绑定到这个临时对象上,并且自动延长临时对象的生命周期,直到func函数执行完毕,避免了临时对象被提前销毁。
再举个更简单的同类例子,你就能明白这是普遍规则,不是vector独有的:
void func(const int& x) {} int main() { func(10); // 10是右值,同样可以绑定到const左值引用 return 0; }
总结一下:普通左值引用为了保证可修改性,只能绑定左值;而const左值引用因为不会修改引用对象,所以允许绑定临时对象/右值,这是C++标准里明确规定的行为。
内容的提问来源于stack exchange,提问作者Minseok Song
相关产品推荐
相关产品推荐

