将非常量引用绑定到临时对象 - 可能发生的示例

时间:2014-04-03 22:11:04

标签: c++

常识是非常量引用不能绑定到临时对象(不能延长其生命周期)。问题是以下程序编译时甚至没有警告

#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的事实;完全可以理解的是,临时使用的存储器在使用之前可能没有受到伤害。

1 个答案:

答案 0 :(得分:3)

术语&#34;临时&#34;是指函数调用表达式f()的返回值,其中f声明为T f();T是非参考对象类型。显然,您的调用表达式a.b().c()不是临时的,因为声明的返回类型c是引用类型。

为了评估函数调用,没有创建临时对象

c是一个自身在临时评估的成员函数这一事实并不重要。 (但是你的代码当然会产生一个悬空引用;它是评估obj的未定义行为。)


(解决问题的正确位置是限定成员函数,例如Type & c() &等,以确保实例参数本身是左值。)