gpt4 book ai didi

c++ - 引用成员绑定(bind)到一个临时对象,该对象的生命周期短于构造对象的生命周期

转载 作者:行者123 更新时间:2023-12-03 07:12:07 25 4
gpt4 key购买 nike

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

Reference member 'context' binds to a temporary object whose life-time would be shorter than the lifetime of the constructed 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 对象,在 context 类成员中存储对该对象的引用。到目前为止,一切都很好。然后,一旦构造函数返回,这个临时对象就会被销毁,留下 context 作为对被销毁对象的引用。此类成员的任何后续使用都将导致未定义的行为。

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

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

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

你的构造函数会这样做,但它是一个临时对象,你的编译器足够聪明,可以找出它并警告你你有很高的风险 demons flying out of your nose .

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

关于c++ - 引用成员绑定(bind)到一个临时对象,该对象的生命周期短于构造对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64524825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com