c ++ lambda表达式函数使用引用导致分段错误

时间:2018-06-14 02:19:29

标签: lambda pass-by-reference

处理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库对我来说太过分了,有人可以解释一下原因吗? 非常感谢

1 个答案:

答案 0 :(得分:0)

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

所以你的代码使用了悬空引用。

按价值捕获是有效的,因为没有悬空引用。事实上,首先使用FUNC而不是const FUNC&作为unit的参数会更好。