我有一个(希望)关于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".
任何人都可以向我解释这个吗?
谢谢你,马库斯
捕获发生在声明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)
| 归档时间: |
|
| 查看次数: |
185 次 |
| 最近记录: |