繁体   English   中英

参考成员绑定到临时 object,其生命周期将短于构造的 object 的生命周期

[英]Reference member binds to a temporary object whose life-time would be shorter than the lifetime of the constructed object

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

引用成员“context”绑定到临时 object,其生命周期将短于构造的 object 的生命周期

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

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;
};

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

context{w, h, onEventInternal }

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

context是参考。 它不是 object。这就是引用的意思:它是对某处其他 object 的引用。

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

您必须构建此引用以引用其他一些现有的 object。

你的构造函数会这样做,但它是一个临时的 object,而且你的编译器足够聪明,可以弄清楚它并警告你,你有很高的风险从你的鼻子里飞出来

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

编译器指的是什么临时 object?

您正在成员初始值设定项列表中构造一个临时Context并将其绑定到引用成员context 临时文件将立即被销毁,并留下悬空的context

App(int w, int h): context{w, h, onEventInternal } {}
//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// constructing a temporary Context and bind to context

class.base.init#8

绑定到内存初始化器中的引用成员的临时表达式格式错误。 [例子5:

 struct A { A(): v(42) { } // error const int& v; };

——结束例子]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM