#include <iostream>
#include <functional>

struct PassMe
{
	PassMe()
	{
		std::cout << "default" << std::endl;
	}
	PassMe(PassMe const &)
	{
		std::cout << "copy" << std::endl;
	}
	PassMe(PassMe &&)
	{
		std::cout << "move" << std::endl;
	}
	PassMe &operator=(PassMe const &)
	{
		std::cout << "copy assign" << std::endl;
		return *this;
	}
	PassMe &operator=(PassMe &&)
	{
		std::cout << "move assign" << std::endl;
		return *this;
	}
	~PassMe()
	{
		std::cout << "destruct" << std::endl;
	}
	void go() const
	{
		std::cout << "go" << std::endl;
	}
};

template<typename T>
auto f(T const &t)
-> std::function<void()>
{
	std::cout << "before" << std::endl;
	std::function<void()> l {[t]{t.go();}};
	std::cout << "after" << std::endl;
	return l;
}

int main()
{
	PassMe pm;
	std::cout << "pre-call" << std::endl;
	auto l = f(pm);
	std::cout << "post-call" << std::endl;
	l();
}
