c++;使用引用的lambda表达式函数导致分段错误 在处理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; } 使用FUNC=std::function; 函数单位(常数函数和左函数、常数函数和右函数){ 返回[&](int-first,int-second)->int{ 返回lf(第一,第二)+rt(第一,第二); }; } 整数输入(整数第一,整数第二){ 先返回; } int main(int argc,char*argv[]){ FUNC x2=单位(输入,输入); x2(10,1); FUNC x3=单位(x2,x2); 自动结果=x3(10,1); std::cout

c++;使用引用的lambda表达式函数导致分段错误 在处理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; } 使用FUNC=std::function; 函数单位(常数函数和左函数、常数函数和右函数){ 返回[&](int-first,int-second)->int{ 返回lf(第一,第二)+rt(第一,第二); }; } 整数输入(整数第一,整数第二){ 先返回; } int main(int argc,char*argv[]){ FUNC x2=单位(输入,输入); x2(10,1); FUNC x3=单位(x2,x2); 自动结果=x3(10,1); std::cout,lambda,pass-by-reference,Lambda,Pass By Reference,当您将函数传递给参数const FUNC&时,会形成一个临时FUNC绑定到const引用。然后lambda通过引用捕获该临时值;x2包含对这些临时函数的引用,这些函数在前一行末尾被销毁 因此,您的代码使用了悬挂引用 按值捕获之所以有效,是因为没有悬空引用。事实上,最好首先使用FUNC而不是const FUNC&作为unit的参数。我仍然不明白为什么x2(10,1)如果x2包含悬空引用,则有效?@MingyuLu undefined行为意味着任何事情都可能发生。我在x2(10,1)之前添加了一些额

当您将函数传递给参数
const FUNC&
时,会形成一个临时
FUNC
绑定到const引用。然后lambda通过引用捕获该临时值;
x2
包含对这些临时
函数的引用,这些函数在前一行末尾被销毁

因此,您的代码使用了悬挂引用


按值捕获之所以有效,是因为没有悬空引用。事实上,最好首先使用
FUNC
而不是
const FUNC&
作为
unit

的参数。我仍然不明白为什么x2(10,1)如果x2包含悬空引用,则有效?@MingyuLu undefined行为意味着任何事情都可能发生。我在x2(10,1)之前添加了一些额外的行,然后失败。这正是问题所在。非常感谢。@M.M