从(std :: function)输出lambda中的reference-passed值?

时间:2017-07-11 02:49:33

标签: c++ c++11 lambda reference

#include "stdafx.h"
#include <functional>
#include <iostream>
#include <string>
std::function<void(int)> Foo()
{
    int v = 1;
    int r = 2;
    auto l = [v, &r](int i)
    {
        std::cout << v << " " << r << " " << i << std::endl;
    };
    return l;
}

int main()
{
    auto func = Foo();
    func(3);
    return 0;
}

我认为会打印“1 2 3”,但是,它是“1 -858993460 3”,为什么?

enter image description here

1 个答案:

答案 0 :(得分:2)

因为r是通过引用捕获的,但它是一个局部变量,并会在Foo()返回后立即销毁。对于func(3);,已捕获的引用已变为无效,并且对其的引用会导致UB;一切皆有可能。

另一方面,v是按值捕获的,这意味着它将被复制到lambda然后运行良好。