Using member variable in lambda capture list inside a member function

前端 未结 4 1152
情歌与酒
情歌与酒 2020-11-27 11:37

The following code compiles with gcc 4.5.1 but not with VS2010 SP1:

#include 
#include 
#include 
#include 

        
相关标签:
4条回答
  • 2020-11-27 12:14

    I believe VS2010 to be right this time, and I'd check if I had the standard handy, but currently I don't.

    Now, it's exactly like the error message says: You can't capture stuff outside of the enclosing scope of the lambda. grid is not in the enclosing scope, but this is (every access to grid actually happens as this->grid in member functions). For your usecase, capturing this works, since you'll use it right away and you don't want to copy the grid

    auto lambda = [this](){ std::cout << grid[0][0] << "\n"; }
    

    If however, you want to store the grid and copy it for later access, where your puzzle object might already be destroyed, you'll need to make an intermediate, local copy:

    vector<vector<int> > tmp(grid);
    auto lambda = [tmp](){}; // capture the local copy per copy
    

    † I'm simplifying - Google for "reaching scope" or see §5.1.2 for all the gory details.

    0 讨论(0)
  • 2020-11-27 12:22

    I believe, you need to capture this.

    0 讨论(0)
  • 2020-11-27 12:23

    Summary of the alternatives:

    capture this:

    auto lambda = [this](){};
    

    use a local reference to the member:

    auto& tmp = grid;
    auto lambda = [ tmp](){}; // capture grid by (a single) copy
    auto lambda = [&tmp](){}; // capture grid by ref
    

    C++14:

    auto lambda = [ grid = grid](){}; // capture grid by copy
    auto lambda = [&grid = grid](){}; // capture grid by ref
    

    example: https://godbolt.org/g/dEKVGD

    0 讨论(0)
  • 2020-11-27 12:27

    An alternate method that limits the scope of the lambda rather than giving it access to the whole this is to pass in a local reference to the member variable, e.g.

    auto& localGrid = grid;
    int i;
    for_each(groups.cbegin(),groups.cend(),[localGrid,&i](pair<int,set<int>> group){
                i++;
                cout<<i<<endl;
       });
    
    0 讨论(0)
提交回复
热议问题