#include <iostream>
using namespace std;

struct hurg
{
	hurg() { cout << "ctor" << endl; }
	hurg(const hurg&) { cout << "copy ctor" << endl; }
	hurg& operator=(const hurg&) { cout << "copy assign ctor" << endl; }
	hurg(hurg&&) { cout << "move ctor" << endl; }
	hurg& operator=(const hurg&&) { cout << "move assign ctor" << endl; }

	~hurg() { cout << "dtor" << endl; }
};

hurg get_hurg() { return hurg(); }

hurg&& get_mhurg() { return hurg(); }

template <typename T>
auto id(T&& x) -> decltype(auto) { return decltype(x)(x); }

int main() {
	cout << "const& get_hurg {" << endl;
	{
		const hurg& h = get_hurg();
		cout << "const& get_hurg -" << endl;
	}
	cout << "const& get_hurg }" << endl;
	
	cout << "&& get_hurg {" << endl;
	{
		hurg&& h = get_hurg();
		cout << "&& get_hurg -" << endl;
	}
	cout << "&& get_hurg }" << endl;

	cout << "const& get_mhurg {" << endl;
	{
		const hurg& h = get_hurg();
		cout << "const& get_mhurg -" << endl;
	}
	cout << "const& get_mhurg }" << endl;

	cout << "&& get_mhurg {" << endl;
	{
		hurg&& h = get_hurg();
		cout << "&& get_mhurg -" << endl;
	}
	cout << "&& get_mhurg }" << endl;

	cout << "const& id {" << endl;
	{
		const hurg& h = id(hurg());
		cout << "&& id -" << endl;
	}
	cout << "&& id }" << endl;

	cout << "&& id {" << endl;
	{
		hurg&& h = id(hurg());
		cout << "&& id -" << endl;
	}
	cout << "&& id }" << endl;
	
	return 0;
}