何时解析了C++ 11 lambda表达式中的变量引用?

bad*_*oms 2 c++ lambda c++11

我有一个(希望)关于lambda表达式的简单问题:

#include <vector>
#include <algorithm>
//----------------------------------------------------------------
void DoSomething()
//----------------------------------------------------------------
{
  std::vector<int> elements;
  elements.push_back(1);
  elements.push_back(2);

  int ref = 1;
  auto printhit = [=](int iSomeNumber)
  {
    if (ref == iSomeNumber)
    {
      printf("Hit: %d\n", iSomeNumber);
    }
    else
    {
      printf("No Hit: %d\n", iSomeNumber);
    }
  };

  ref = 2;
  std::for_each(elements.begin(), elements.end(), printhit);   
}
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是:当我使用capture [=]定义printhit时,它会打印"Hit:1".如果我通过引用[&]传递它,它会打印"Hit:2".我以某种方式预期,替换是在for_each中完成的,因此无论我如何授予对"ref"的访问权限,都会打印"Hit:2".

任何人都可以向我解释这个吗?

谢谢你,马库斯

Ben*_*ley 5

捕获发生在声明lambda的位置.就像你要在那个点创建一个类对象并传递ref给它的构造函数一样.

你的例子等同于:

class Functor
{
public:
    Functor(int r) :ref(r) {}

    void operator()(int iSomeNumber) const
    {
        if (ref == iSomeNumber)
        {
            printf("Hit: %d\n", iSomeNumber);
        }
        else
        {
            printf("No Hit: %d\n", iSomeNumber);
        }    
    }
private:
    int ref;
};

void DoSomething()
//----------------------------------------------------------------
{
  std::vector<int> elements;
  elements.push_back(1);
  elements.push_back(2);

  int ref = 1;
  Functor printhit(ref);

  ref = 2;
  std::for_each(elements.begin(), elements.end(), printhit);   
}
Run Code Online (Sandbox Code Playgroud)