如果在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);
}
答案 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”作为函数中的局部变量,为什么它会通过引用而不是值传递?