誰かがこのコードが機能しない理由を説明できますか (呼び出しから戻る前の GCC4.7.3 seg-faults で)?
#include <iostream>
#include <functional>
#include <memory>
using namespace std;
template<typename F>
auto memo(const F &x) -> std::function<decltype(x())()> {
typedef decltype(x()) return_type;
typedef std::function<return_type()> thunk_type;
std::shared_ptr<thunk_type> thunk_ptr = std::make_shared<thunk_type>();
*thunk_ptr = [thunk_ptr, &x]() {
cerr << "First " << thunk_ptr.get() << endl;
auto val = x();
*thunk_ptr = [val]() { return val; };
return (*thunk_ptr)();
};
return [thunk_ptr]() { return (*thunk_ptr)(); };
};
int foo() {
cerr << "Hi" << endl;
return 42;
}
int main() {
auto x = memo(foo);
cout << x() << endl ;
cout << x() << endl ;
cout << x() << endl ;
};
私の元の仮定:
- それぞれ
std::function<T()>
は、クロージャを表すオブジェクトへの参照/shared_ptr のようなものです。つまり、ピックアップされた値の寿命はそれによって制限されます。 std::function<T()>
オブジェクトには、古いクロージャー (エンドライフタイムで選択された値) を破棄し、新しい値の所有権を取得する代入演算子があります。