从lambda获取有效变量

时间:2011-10-19 16:11:20

标签: c++ lambda pass-by-reference c++11

我想知道以下样式的引用捕获是否有效:

struct Foo {
 Foo( boost::function<void()> v);

 int get() const;
};

int main() {
 Foo instance( [&]() -> void { int value = instance.get(); .... } );

如您所见,我正在捕获对lambda传递时正在构造的对象的引用。看起来如果在构造函数完全执行之前调用lambda,那么你正在访问一个部分构造的对象,你将获得所有代表的危险。

然而,这是允许的吗?看起来,只要你确定你能理解什么时候可以调用lambda就可以了。

2 个答案:

答案 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 ++中的其他地方一样,可以编写具有未定义行为的代码,以便更方便地利用定义行为的案例子集。