在lambda中,如何通过值捕获引用

时间:2013-10-30 07:41:21

标签: c++ c++11

如果在lambda中按值捕获引用类型的变量,它是通过引用还是值捕获的?

带问题的小样本:

#include <iostream>

struct Test {
  int a;
};

void testFunc(const Test &test) {
  auto a = [=] {
    // does 'test' is being passed to closure object with copy
    // or by reference?
    return test.a;
  } ();
  std::cout << a;
}

int main() {
  Test test{1};
  testFunc(test);
}

1 个答案:

答案 0 :(得分:29)

按价值计算。可编辑的例子:

class C
{
public:
    C()
    {
        i = 0;
    }

    C(const C & source)
    {
        std::cout << "Copy ctor called\n";
        i = source.i;
    }

    int i;
};

void test(C & c)
{
    c.i = 20;

    auto lambda = [=]() mutable {

        c.i = 55;
    };
    lambda();

    std::cout << c.i << "\n";
}

int main(int argc, char * argv[])
{
    C c;
    test(c);

    getchar();
}

结果:

Copy ctor called
20

我想,C ++标准的这一段适用:

5.1.2 Lambda表达式

(......) 14.如果隐式捕获实体,则 copy 捕获实体, capture-default = =或者是否明确 使用不包含&amp;的捕获捕获对于由副本捕获的每个实体,一个未命名的非静态实体 数据成员在闭包类型中声明。这些成员的声明顺序未指定。 如果实体不是a,则这种数据成员的类型是相应的捕获实体的类型 引用对象,或引用的类型。 [注意:如果捕获的实体是对a的引用 函数,对应的数据成员也是对函数的引用。 - 结束注释]

这实际上是有意义的 - 如果局部变量是通过值传递的,并且参数传递的参数“act”作为函数中的局部变量,为什么它会通过引用而不是值传递?