函数返回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
相关产品推荐
相关产品推荐

