我想知道以下样式的引用捕获是否有效:
struct Foo {
Foo( boost::function<void()> v);
int get() const;
};
int main() {
Foo instance( [&]() -> void { int value = instance.get(); .... } );
如您所见,我正在捕获对lambda传递时正在构造的对象的引用。看起来如果在构造函数完全执行之前调用lambda,那么你正在访问一个部分构造的对象,你将获得所有代表的危险。
然而,这是允许的吗?看起来,只要你确定你能理解什么时候可以调用lambda就可以了。
答案 0 :(得分:2)
在您通过在v()
构造函数中编写Foo
来执行lambda之前,不执行lambda。如果你这样做,那么就像你直接从构造函数调用函数get()
一样,这很好,如果 get
不是{{1}函数,你已经实现了virtual
,这样它也可以从构造函数中调用。例如,如果您这样做:
在此,get
的实现不需要完全构造对象。
此外,虽然它与您的问题无关,但仍然记下,因为您使用的是C ++ 11(正如使用lambda所暗示的那样),为什么不使用get
代替std::function
(就像我在demo中所做的那样)?如果您的编译器支持lambda,它也将支持boost::function
,因为它的实现非常简单。
答案 1 :(得分:1)
如果存储lambda函数对象,并且在完全构造对象之前不调用它,则没有问题。与C ++中的其他地方一样,可以编写具有未定义行为的代码,以便更方便地利用定义行为的案例子集。