常识是非常量引用不能绑定到临时对象(不能延长其生命周期)。问题是以下程序编译时甚至没有警告
#include <iostream>
struct Type
{
int m;
Type b() {
Type ret = {1};
return ret;
}
Type& c() {
return *this;
}
};
int main()
{
Type a;
Type &obj = a.b().c(); // b() returns a temporary and c() a reference to that!
std::cout << obj.m << std::endl;
return 0;
}
b()返回一个临时和c()引用! this怎么可能?
PS:它比我输出正确结果的事实更能编译buffles的事实;完全可以理解的是,临时使用的存储器在使用之前可能没有受到伤害。
答案 0 :(得分:3)
术语&#34;临时&#34;是指函数调用表达式f()
的返回值,其中f
声明为T f();
而T
是非参考对象类型。显然,您的调用表达式a.b().c()
不是临时的,因为声明的返回类型c
是引用类型。
为了评估函数调用,没有创建临时对象。
c
是一个自身在临时评估的成员函数这一事实并不重要。 (但是你的代码当然会产生一个悬空引用;它是评估obj
的未定义行为。)
(解决问题的正确位置是限定成员函数,例如Type & c() &
等,以确保实例参数本身是左值。)