临时对象能否绑定非const引用?成员与全局函数差异解惑
问题解答
首先看你的原代码:
#include <iostream> class A{ public: int a=5; int& g(){ return a; } A f(){ return *this; } }; int main() { A obj; std::cout<<obj.f().g(); return 0;}
改成全局函数后的代码:
int& g(A& obj){ return obj.a; }
两者的核心差异在于C++对成员函数调用和全局函数参数绑定的规则不同:
临时对象(右值)允许调用非const成员函数
C++标准允许右值调用任意成员函数,哪怕是返回非const引用的成员函数。当你调用obj.f()得到临时A对象(右值)时,调用它的g()成员函数,编译器会自动把这个临时对象作为this指针传递给g(),g()返回的是该临时对象内部a的引用,这个操作本身是合规的。非const左值引用无法绑定到右值
全局函数的参数A&属于非const左值引用,C++明确禁止将右值(临时对象)绑定到这类引用上——这是安全限制,因为非const左值引用通常暗示要修改对象,而临时对象生命周期极短,修改或持有它的引用容易引发悬空引用、未定义行为等问题,所以编译器直接报错。
注意:原代码虽然能编译,但存在潜在风险——临时对象在obj.f().g()表达式执行完毕后就会销毁,返回的引用会变成悬空引用,若后续使用该引用会触发未定义行为。
内容的提问来源于stack exchange,提问作者123
相关产品推荐
相关产品推荐

