gpt4 book ai didi

c++ - 为什么我们需要为 lambda 中的引用捕获引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:36 27 4
gpt4 key购买 nike

考虑一下:

class TestLambda {
public:
std::vector<char> data;
};

void test_lambda(TestLambda& obj) {
[=]() mutable {
obj.data.push_back(0x01);
}();
}

int main() {
TestLambda tst;
tst.data.push_back(0x99);
test_lambda(tst);

// tst.data is unchanged at this point

return 0;
}

在调用 test_lambda 后,我希望看到 tst.data 发生变化,但事实并非如此。要查看更改,我必须创建再次传递 obj 引用的 lambda,即。 [&obj]()

为什么我们需要这个?我的意思是,又是一个引用?

obj 已经是一个引用。然后,lambda 通过复制它来捕获 obj。那么,lambda 本身中的 obj 不是引用?为什么?

有人能给我解释一下吗?谢谢。

最佳答案

当在赋值的右侧使用时,引用就像“普通”变量一样工作。每当您定义按值捕获的 lambda 时,lambda 都会拥有外部变量的拷贝,就像 lambda 以这些行开头一样:

auto my_inner_variable = my_outer_reference;
auto my_inner_other_variable = my_outer_other_variable;

如果您希望引用“保留”为引用,则必须通过引用捕获它,从而指示编译器发出如下代码:

auto& my_inner_variable = my_outer_reference;
auto& my_inner_other_variable = my_outer_other_variable; // if we instructed to capture everything by reference

关于c++ - 为什么我们需要为 lambda 中的引用捕获引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755358/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com