例如:规则拉姆达捕获变量
class Example
{
public:
explicit Example(int n) : num(n) {}
void addAndPrint(vector<int>& v) const
{
for_each(v.begin(), v.end(), [num](int n) { cout << num + n << " "; });
}
private:
int num;
};
int main()
{
vector<int> v = { 0, 1, 2, 3, 4 };
Example ex(1);
ex.addAndPrint(v);
return 0;
}
当你编译和运行MSVC2010这您会收到以下错误:
错误C3480: '例子:: NUM':一个lambda捕获变量必须是从一个封闭函数作用域
然而,随着克++ 4.6.2(预发布)你得到:
根据标准草案哪个编译器是正确的?
请注意,您必须在这里按值来捕获'this',而不是'num'。当你使用'num'时,你真的使用'this-> num'。另请注意,MSVC没有实现lambda表达式的C++ 11措辞,因为它在2008年后实现了这一切。 –
@Alexandre:捕获'this'与通过引用捕获'num'实际上是一样的。这似乎不是这里所期望的。 –
// @本:很好。然而结果在这里是一样的,因为闭包不会转义addAndPrint的作用域(而且整个事情很可能在这里被内联)。 5.1.2由@dimitri引用似乎表明MSVC是正确的,因为'num'不是具有自动存储持续时间的变量。然而,这种行为很奇怪。 –