有人可以描述为什么这段代码不起作用(在从呼叫返回之前的 GCC4.7.3 段错误上)吗?
#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()>
对象具有赋值运算符,它将放弃旧的闭包(结束生命周期选择的值),并将获得新值的所有权。
PS 这个问题是在我阅读了关于 C++11 中懒惰的问题后提出的