You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何const左值引用可绑定右值,而const右值引用无法绑定左值?

为什么const右值引用无法绑定左值?

先看几个相关的代码示例:

普通值传递的函数

#include <iostream>
int fun(int arg){
    return arg;
}
int main() {
    int a=10;
    std::cout<<fun(a);
    return 0;
}

const左值引用可接收左值和右值

要让左值引用形参兼容右值,只需将其声明为const:

#include <iostream>
int fun(const int& arg){
    return arg;
}
int main() {
    int a=10;
    std::cout<<fun(a);
    std::cout<<fun(10); // 两者都能正常运行
    return 0;
}

const右值引用无法绑定左值

但使用const右值引用时,传入左值会触发编译错误:

#include <iostream>
int fun(const int&& arg){
    return arg;
}
int main() {
    int a=10;
    std::cout<<fun(a);  // 编译错误
    std::cout<<fun(10); 
    return 0;
}

对应的编译错误信息:

cpp:9:20: error: cannot bind rvalue reference of type 'const int&&' to lvalue of type 'int'
9 | std::cout<<fun(a);
| ^
/tmp/ufgkAH4KAC.cpp:3:21: note: initializing argument 1 of 'int fun(const int&&)'
3 | int fun(const int&& arg){
| ~~~~~~~~~~^


原因解析

这是C++标准的引用绑定规则直接决定的:

  • 左值引用(非const):只能绑定到可修改的左值,无法绑定右值;
  • const左值引用:属于特殊规则,为了简化临时对象的使用场景,标准特意放宽限制,允许它绑定到左值、右值以及临时对象;
  • 右值引用(包括const右值引用):核心设计目标就是仅绑定右值。右值本质是临时、即将被销毁的对象,右值引用的作用就是接管这类临时对象的资源。左值是拥有持久生命周期的变量,标准不允许将左值绑定到右值引用(哪怕是const修饰的),因为这完全违背了右值引用的设计初衷——它就是用来识别临时对象的标识。

如果确实需要把左值传给右值引用参数,可以通过std::move(a)将左值强制转换为右值,但这么做会转移a的资源所有权,使用时需谨慎。


内容的提问来源于stack exchange,提问作者Kroky_Glauttas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:15:13