c++ - 引用成员绑定到一个临时对象,其生命周期将短于构造对象的生命周期
问题描述
我在尝试初始化 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;
};
解决方案
在构造函数的初始化部分:
context{w, h, onEventInternal }
这构造了一个临时Context
对象,将对该对象的引用存储在context
类成员中。到目前为止,一切都很好。然后,一旦构造函数返回,这个临时对象就会被销毁,context
作为对被销毁对象的引用。对此类成员的任何后续使用都将导致未定义的行为。
context
是参考。它不是一个对象。这就是引用的含义:它是对某个其他对象的引用。
引用所指的对象是完全不同的独立对象。
您必须构造此引用以引用其他一些现有对象。
您的构造函数会这样做,但它是一个临时对象,并且您的编译器足够聪明,可以弄清楚并警告您,恶魔从鼻子里飞出的风险很高。
您需要将类成员更改为独立对象,而不是引用,或者将引用传递给构造函数,并让构造函数将类成员设置为对其他对象的传入引用。
推荐阅读
- oracle - 调用oracle过程而不放置所有参数
- python - 我想在这里做什么?train acc: 100%, test acc: 80% 这是否意味着过拟合?
- python - 如何根据名称创建 pydicom 标签?
- azure-data-factory - 数据工厂持续集成部署 - 使用托管身份的 AAD 身份验证时 IR 出现问题
- c# - 如何测量每个 Web 请求的 Azure CosmosDB 请求单位?
- javascript - canvg SVG 渲染为错误的格式
- r - 控制 genoPlotR plot_gene_map 中的边距
- javascript - 事件函数内部的 Ajax 调用
- hyperlink - 在 Gmail 中获取指向特定用户的特定电子邮件的链接
- javascript - 开始日期不应大于结束日期 jquery php