为何将右值传递给左值引用在该场景下可行?
为何将右值传递给左值引用在该场景下可行?
嗨,这个问题抓得很准!你发现的这个看似“违规”的写法,其实是利用了C++中赋值表达式的一个关键特性,咱们来慢慢拆解清楚:
首先得明确一个基础规则:通常情况下,非const的左值引用(比如你的std::vector<int>&)是不能直接绑定右值的——比如你要是直接写print(std::vector<int>{1,2,3,4,5}),编译器肯定会报错,因为临时的vector对象是右值,没法直接传给左值引用参数。
但你的代码里不是直接传右值,而是传了一个赋值表达式的结果,这就是关键!
在C++标准里,赋值运算符=的返回值是一个左值引用,指向被赋值的对象。咱们看你的代码:std::vector<int>(5) = {1,2,3,4,5}
这个表达式的执行步骤是:
- 先创建一个临时的vector对象(
std::vector<int>(5)),这是个右值; - 对这个临时对象执行赋值操作,把
{1,2,3,4,5}的元素赋值进去; - 赋值表达式返回这个临时对象的左值引用——也就是说,整个表达式的结果是一个左值,而非右值。
这时候,把这个左值传给print函数的std::vector<int>&参数就完全合法了!而且C++会自动延长这个临时对象的生命周期,直到print函数执行完毕,所以你在函数里打印元素的时候不会出现悬空引用的问题。
简单总结几点:
- 赋值表达式的结果是左值引用,完美匹配左值引用参数的要求;
- 临时对象的生命周期会被延长到函数调用结束,保证了操作的安全性;
- 这是C++标准明确规定的行为,不是编译器的“特殊照顾”。
备注:内容来源于stack exchange,提问作者Aik
相关产品推荐
相关产品推荐

