#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;
}