次のコードは正常に動作します。
#include <iostream>
#include <functional>
std::function<int (void)> get_incrementer() {
return []() {
static int count = 0;
return count++;
};
}
int main() {
using std::cout;
auto incrementer = get_incrementer();
cout << incrementer() << std::endl;
cout << incrementer() << std::endl;
return 0;
}
しかし、代わりに参照によってローカル変数をキャプチャすると、おそらく呼び出し時にスタック上のその場所が他の何かによって使用されているため、突然未定義の動作が発生します。
std::function<int (void)> get_incrementer() {
int count = 0;
return [&count]() {
return count++;
};
}
なぜコンパイラはそれを許可するのですか? 私は、コンパイラがこれを許可しないか (このケースをチェックするのは簡単なようです)、ローカル変数の保存期間を変更することを期待していました。