首页 > 解决方案 > 引用成员绑定到一个临时对象,其生命周期将短于构造对象的生命周期

问题描述

我在尝试初始化 a 时遇到以下编译器错误Context

引用成员 'context' 绑定到一个临时对象,其生命周期将短于构造对象的生命周期

. object编译器指的是什么临时的?onEventInternal所以static生命周期不能更短

class Event {};

class Context {
    Context(int width, int height, void(*eventCallback)(Event&)) {}
};

class App {

    App(int w, int h): context{w, h, onEventInternal } {} // Error here! 

    static void onEventInternal(Event& event) {
        //event handling
    }
    
private:
    const Context& context;
};

标签: c++

解决方案


在构造函数的初始化部分:

context{w, h, onEventInternal }

这构造了一个临时Context对象,将对该对象的引用存储在context类成员中。到目前为止,一切都很好。然后,一旦构造函数返回,这个临时对象就会被销毁,context作为对被销毁对象的引用。对此类成员的任何后续使用都将导致未定义的行为。

context是参考。它不是一个对象。这就是引用的含义:它是对某个其他对象的引用。

引用所指的对象是完全不同的独立对象。

您必须构造此引用以引用其他一些现有对象。

您的构造函数会这样做,但它是一个临时对象,并且您的编译器足够聪明,可以弄清楚并警告您,恶魔从鼻子里飞出的风险很高。

您需要将类成员更改为独立对象,而不是引用,或者将引用传递给构造函数,并让构造函数将类成员设置为对其他对象的传入引用。


推荐阅读