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

函数返回const引用为何无法阻止返回值赋值给非const变量?

问题解析:const引用返回为何能赋值给非const对象?

先看你提供的代码:

class Test {
public:
    int k = 10;
};

class SecondTest {
private:
    Test t;
public:
    const Test& myTest() {
        return t;
    }
};

int main()
{
    SecondTest secondTest;
    Test tt = secondTest.myTest();
    tt.k = 20;
    cout << "tt.k value: " << tt.k;
}

你疑惑的核心是混淆了引用指向的原对象和拷贝生成的新对象,具体拆解如下:

  • const Test& myTest()的作用是返回内部t的const引用,这意味着你不能通过这个引用直接修改原对象t——比如尝试写secondTest.myTest().k = 20;会直接编译报错,编译器会阻止通过const引用修改原对象的操作。
  • 而Test tt = secondTest.myTest();这句代码,本质是调用Test的拷贝构造函数,以const引用指向的原对象t为蓝本,创建了一个全新的非const Test对象tt。你后续修改的是这个拷贝出来的新对象,和原对象t完全无关,所以编译器不会限制这种操作,运行后自然输出tt.k value: 20。

如果想阻止这种拷贝行为,让调用者只能使用原对象的const视图,可以在C++11及以后显式删除Test的拷贝构造函数:

class Test {
public:
    int k = 10;
    Test(const Test&) = delete; // 删除拷贝构造
};

此时Test tt = secondTest.myTest();会直接编译失败,达到你原本预期的“禁止修改相关对象”的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:20:42