簡體   English   中英

lambda捕獲變量的規則

[英]Rule for lambda capture variable

例如:

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:'Example :: num':lambda捕獲變量必須來自封閉的函數作用域

但是,使用g ++ 4.6.2(預發行版),您將得到:

1 2 3 4 5

根據標准草案哪個編譯器是正確的?

5.1.2 / 9:

本地lambda表達式的到達范圍是包含范圍的集合,包括最里面的封閉函數及其參數。

和5.1.2 / 10:

使用通常的非限定名稱查找規則(3.4.1)查找捕獲列表中的標識符; 每個這樣的查找應該找到一個變量,其自動存儲持續時間在本地lambda表達式的到達范圍內聲明。

由於num既未在任何函數范圍內聲明,也未具有自動存儲持續時間,因此無法捕獲它。 因此VS是正確的,而g ++是錯誤的。

標准說明如下(5.1.2):

使用通常的非限定名稱查找規則(3.4.1)查找捕獲列表中的標識符; 每個這樣的查找應該找到一個變量,其自動存儲持續時間在本地lambda表達式的到達范圍內聲明。

據我所知,GCC編譯器是正確的,因為'num'在lambda聲明點處於達到范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM