gpt4 book ai didi

c++ - Lambda 捕获

转载 作者:太空狗 更新时间:2023-10-29 19:37:20 25 4
gpt4 key购买 nike

我总是对 lambda 捕获感到困惑,我不知道变量是按引用捕获还是按值捕获。例如,如果我有 [a] 我不知道 a 是按值还是按 ref 捕获。

我认为获得它的一种简单方法是通过示例。因此,让我们为每种情况准备一个(如果有更多的方式来表达同一件事,则更多):

捕获:

  • 没有
  • 全部引用
  • 全部按值(value)
  • r1, r2 引用。没有别的。
  • v1, v2 按值。没有别的。
  • r1, r2 引用。按值(value)休息。
  • v1, v2 按值。引用休息。
  • r1, r2 通过引用,v1, v2 通过值。没有别的。

让我们完全忽略this,因为那是另一袋蠕虫。

最佳答案

简而言之:

[]{ }          // do not capture anything
[foo]{ } // capture `foo` by value
[&foo]{ } // capture `foo` by reference
[foo, &bar]{ } // capture `foo` by value, `bar` by reference
[=, &foo]{ } // capture everything by value, `foo` by reference
[&, foo]{ } // capture everything by reference, `foo` by value

在 C++14 中,您还有广义 lambda 捕获:

[i=0]{ }  // create closure with `i` data member initialized to `0`
[i=j]{ } // create closure with `i` data member initialized to `j`
[i{0}]{ } // create closure with `i` data member initialized to `0`
[i{j}]{ } // create closure with `i` data member initialized to `j`

// create closure with `uptr` data member initialized to `std::move(uptr)`
[uptr = std::move(uptr)]{ }

// create closure with `foo` reference data member initialized to `something`
[&foo = something]{ }

如果您想通过引用或值有条件地捕获,您可以使用广义 lambda 捕获 来实现某种“完美转发捕获”:"capturing perfectly-forwarded objects in lambdas" .


Let's completely ignore this as that is another bag of worms.

[this]{ }  // capture `this` by value (the pointer)
[*this]{ } // store a copy of `*this` inside the closure

关于c++ - Lambda 捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46809901/

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