今天我在C++ 11 lambda中遇到了一個非常不直觀的行爲(至少對我來說)。有問題的代碼如下:返回一個lambda捕獲一個局部變量
#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);
}
而不是打印5,這種打印亂碼。實際上,至少在我的GCC版本中,如果打開-O2優化標誌,它實際上會打印5.由於輸出取決於編譯器的優化級別,因此它是未定義的行爲。過了一段時間,我想我明白髮生了什麼事。
當函數sum被調用時,與參數x相對應的堆棧變量被設置爲2,然後函數sum返回,並且該堆棧變量可能被編譯器需要放置的任何東西覆蓋以執行下面的代碼,並且在lambda最終得到執行時,x不再存在的地方保存爲2,程序將3加到任意整數。
是否有任何優雅的方式來做C++中的currying保證變量被正確捕獲?
按值「[=]」捕獲。 – Galik
謝謝!這比我想象的要簡單。 –
僅供讀者閱讀,這是C++ 14,而不是C++ 11。在C++ 14中添加了函數返回值的類型推導。 – cdhowie