例如:
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 表达式的范围。
As num
既没有在任何函数作用域中声明,也没有自动存储持续时间,因此无法捕获。因此 VS 是正确的,而 g++ 是错误的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)