标准5.1.2 6规定有一个从lambda表达式到相应函数指针类型的转换函数,没有捕获。带捕获功能的lambda呢?下面的代码编译时没有警告。这会导致未定义的行为吗?
std::function<void()> makeFucntion(int& parameter)
{
return [¶meter]() // convert the lambda to std::function
{
cout << parameter;
};
}
int var = 4;
auto foo = makeFucntion(var);
foo();
如果有未定义的行为,是否有另一种方法来返回一个lambda表达式从一个函数捕获在c++11?
std::function<void()>
不是函数指针。std::function<void()>
可以存储的不仅仅是函数指针。
如果你试图返回一个函数指针void(*)()
,那么代码将无法编译,因为带有捕获的lambdas没有转换为函数指针。
由于parameter
是通过引用传递和捕获的,当您调用foo()
时,var
仍在作用域中,因此代码很好。