Jes*_*ood 7 c++ lambda g++ visual-c++ c++11
例如:
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;
}
Run Code Online (Sandbox Code Playgroud)
当您在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 ++是错误的.