例如:規則拉姆達捕獲變量
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'不是具有自動存儲持續時間的變量。然而,這種行爲很奇怪。 –