繁体   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