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

为何无法将非const左值引用绑定到右值并修改?

为什么非const左值引用不能绑定右值?

我们可以将const左值引用绑定到右值,但普通左值引用无法做到这一点,先看下面的示例代码:

#include <iostream>

int compute()
{
    return 7*4;
}

int main(int a, char**b)
{
    int val_copy = compute();
    const int& val_ref = compute();
    int&& val_rval_ref = compute();

    std::cout << val_copy << " " << val_ref << " " << val_rval_ref << std::endl;
    val_copy++;
    //val_ref++ error because it's const
    val_rval_ref++;
    std::cout << val_copy << " " << val_ref << " " << val_rval_ref << std::endl;
    return 0;
}

输出(C++17):

28 28 28
29 28 29

示例里const int&和int&&都能绑定compute()返回的右值,但非const左值引用(比如int&)不行,核心原因可以从这几点理解:

  • 避免无意义的错误修改:右值本质是临时对象,修改它通常没有实际价值。比如如果允许int& ref = compute(); ref++;,修改后的临时对象会立刻销毁,没有任何代码能用到这个修改后的结果,这种写法大概率是程序员的笔误。C++直接禁用这种绑定,就是为了提前阻止这种无意义的错误。

  • 明确的设计语义区分:左值引用(非const)的语义是“引用一个能持久存在、可被后续代码访问修改的对象”,而右值是“临时、即将被销毁的对象”。如果允许非const左值引用绑定右值,就违背了左值引用的语义,会让程序员误以为自己操作的是一个持久对象,最终导致逻辑错误。

  • 右值引用的专属职责:C++11引入右值引用(T&&)的核心目的之一,就是专门用来绑定右值并允许修改,这是为了实现移动语义(比如转移临时对象的资源,避免不必要的拷贝)。这种设计把“修改临时对象”的场景明确交给了右值引用,而非const左值引用本来就不是为处理临时对象设计的。

简单来说,禁止非const左值引用绑定右值,是C++在语义清晰性和防错性上的设计选择——既避免了无意义的操作,又明确了不同引用类型的职责边界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:39:22