我有以下结构:
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;
}
Run Code Online (Sandbox Code Playgroud)
我以为:
const Test& myTest() {
Run Code Online (Sandbox Code Playgroud)
将使返回值成为 const。
但不,我可以简单地分配给一个非常量值,并将其用作非常量值:
Test tt = secondTest.myTest();
Run Code Online (Sandbox Code Playgroud)
打印结果将是
"tt.k value: 20"
Run Code Online (Sandbox Code Playgroud)
这对我来说听起来很奇怪......我是否错过了一些概念?
Test tt = secondTest.myTest()
Run Code Online (Sandbox Code Playgroud)
该函数返回对 const 对象的引用。该对象无法修改。
但是该Test tt = ...部分会触发进行复制的复制构造函数。该副本可以修改。
你写过吗
Test& tt = secondTest.myTest()
Run Code Online (Sandbox Code Playgroud)
编译器会发出错误,阻止您获得对此对象的非常量引用。如果您保留了const Test&,那么您将无法修改它。