【发布时间】:2011-12-11 02:04:27
【问题描述】:
我想知道以下引用捕获样式是否有效:
struct Foo {
Foo( boost::function<void()> v);
int get() const;
};
int main() {
Foo instance( [&]() -> void { int value = instance.get(); .... } );
如您所见,我正在捕获对传递 lambda 时正在构造的对象的引用。看起来,如果在构造函数完全执行之前调用 lambda,那么您正在访问一个部分构造的对象,并且您会遇到所代表的所有危险。
但是,这是否允许?似乎只要您确保了解何时可以调用 lambda 就可以了
【问题讨论】:
-
Foo的构造函数对v做了什么?
-
它可能会存储它以供以后调用。估计是在施工之后。据了解,在完全构建之前调用它会是一个错误,或者至少是有风险的
-
它只是从最新的 MSVC 和英特尔 C++ 编译器中得到一个编译错误:“
instance未定义”。所以,答案很明确:这是不允许的。或者,您可以在 lambda 中将Foo*作为参数传递,并在调用 lambda 时传递this。 -
@minjang:它在我的 gcc 4.5.2 上编译得很好,
std::function -
我很确定 gcc 是错误的,它不应该编译。变量的作用域直到声明之后才开始。
标签: c++ lambda pass-by-reference c++11