我只想通过引用将arr
的第三个元素传递到lambda捕获表达式中。如果没有以下代码段中的int &value = arr[2];
,是否可以这样做?
#include <functional>
#include <iostream>
#include <iterator>
#include <thread>
#include <vector>
#include <condition_variable>
int main(int argc, char *argv[])
{
std::vector<int> arr = {3,1,4};
std::cout << &arr[2] << std::endl;
std::vector<std::function<void(void)>> vfunc;
for (int i = 0; i < 3; i++) {
int a = i * 2;
int &value = arr[2];
std::function<void()> fn = [=,&value](){
//std::cout << a << std::endl;
std::cout << &value << std::endl;
};
vfunc.push_back(fn);
}
for (auto& f : vfunc)
{
f();
}
return 0;
}
答案 0 :(得分:4)
是的,您可以通过初始化程序指定的by-reference capture完成此操作。
&标识符初始值设定项(6)(自C ++ 14起)
6)使用初始化程序按引用捕获
例如
std::function<void()> fn = [=,&value=arr[2]](){
// ^^^^^^^
//std::cout << a << std::endl;
std::cout << &value << std::endl;
};
答案 1 :(得分:2)
是否可以在没有
int &value = arr[2];
的情况下执行此操作?
是的,您可以将命名引用添加到闭包并像这样初始化它们:
std::function<void()> fn = [=, &value = arr[2]](){ /* ... */ }
这并不要求C ++ 14可用。如果可以使用C ++ 17,则对于不修改arr[2]
的特定lambda主体,您还可以考虑添加const
-ness:
std::function<void()> fn = [=,&value = std::as_const(arr[2])](){ /* ... */ }
//^^^^^^^^^^^^ verbose but useful