C++中引用指向函数返回值是否可行?相关代码疑问解析
C++返回值与引用绑定问题解析
先看给出的类定义与调用代码:
class AA { private: string s = "asd"; public: string func1() { return s; } string& func2() { return s; } };
调用代码:
AA a; auto &r1 = a.func1(); auto &r2 = a.func2();
关于r1的指向
r1不会指向AA::s,它绑定的是func1()返回的临时匿名对象。
这里要说明:按照C++标准,非const左值引用不能绑定到临时对象,你测试能运行是因为部分编译器(比如GCC)提供了非标准扩展。标准的合法写法应该是const auto& r1 = a.func1();,这种情况下临时对象的生命周期会被延长至引用的生命周期结束。
关于RVO的疑问
不管是否触发RVO(返回值优化),r1都不会指向AA::s。RVO的作用是避免临时对象的拷贝操作,直接把要返回的s的拷贝构造在调用方的内存空间中,但它本质上还是一个独立的对象,和原AA::s是两个完全不同的实例。哪怕RVO生效,修改r1也不会影响AA::s,反之亦然。
而r2确实直接绑定到AA::s本身,修改r2会直接改变a的成员变量s,这部分你的理解是正确的。
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

