如何命名C ++捕获变量?

时间:2019-07-30 10:24:16

标签: c++ lambda

我只想通过引用将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;
}

2 个答案:

答案 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