今日、私はC++ 11ラムダで非常に直感的ではない動作に遭遇しました。問題のコードは次のとおりです。ローカル変数をキャプチャするラムダを返す
#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が返されます。このスタック変数は、コンパイラが次のコードを実行するために必要なものによって上書きされる可能性がありますラムダが最終的に実行されるまでに、xがもはや保持していなかった場所で、プログラムは任意の整数に3を加えます。
C++でカリングを行うためのエレガントな方法はありますか?変数が正しく取得されることを保証しますか?
値 '[=] 'で取り込みます。 – Galik
ありがとう!それは私の予想以上に簡単でした。 –
ちょうど読者のために、これはC++ 14ではなく、C++ 11です。関数の戻り値の型控除がC++ 14で追加されました。 – cdhowie