今天我在C++ 11 lambdas中遇到了一个非常不直观的行为(至少对我来说).有问题的代码如下:
#include <stdio.h>
auto sum(int x) {
return [&x](int y) {
return x + y;
};
}
int main() {
int a = sum(2)(3);
printf("%d\n",a);
}
Run Code Online (Sandbox Code Playgroud)
这不打印5,而是打印乱码.实际上,至少在我的GCC版本中,如果我打开-O2优化标志,它实际上会打印5.由于输出取决于编译器的优化级别,因此它是未定义的行为.过了一会儿,我想我明白了发生了什么.
当调用函数sum时,对应于参数x的堆栈变量设置为2,然后函数sum返回,并且此堆栈变量可能被编译器需要放在那里执行以下代码的任何内容覆盖,并且最终执行lambda的时间,x不再保持2的位置,程序将3添加到任意整数.
有没有优雅的方法在C++中进行currying,保证变量被正确捕获?