处理c ++ lambda表达式时遇到问题。 这是我的代码:
using FUNC = std::function<int(int, int)>;
FUNC unit( const FUNC& lf, const FUNC& rt ) {
return [&]( int first, int second ) -> int {
return lf( first, second ) + rt( first, second );
};
}
int input( int first, int second ) {
return first;
}
int main( int argc, char* argv[] ) {
FUNC x2 = unit( input, input );
x2( 10, 1 );
FUNC x3 = unit( x2, x2 );
auto result = x3( 10, 1 );
std::cout << result << std::endl;
return 0;
}
运行时,x2(10,1)没问题,但x3(10,1)导致分段错误。 如果我在&#34; unit&#34;中更改lambda表达式从[&amp;]到[=],一切都很好。
调试STL库对我来说太过分了,有人可以解释一下原因吗? 非常感谢
答案 0 :(得分:0)
将函数传递给参数const FUNC&
时,会形成一个临时FUNC
以绑定到const引用。然后lambda通过引用捕获临时值;所以x2
包含对这些临时FUNCs
的引用,这些引用在上一行的末尾被销毁。
所以你的代码使用了悬空引用。
按价值捕获是有效的,因为没有悬空引用。事实上,首先使用FUNC
而不是const FUNC&
作为unit
的参数会更好。