[英]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
? 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
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
绑定到内存初始化器中的引用成员的临时表达式格式错误。 [例子5:
struct A { A(): v(42) { } // error const int& v; };
——结束例子]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.