#include <iostream>
class logged_creation
{
public:
logged_creation() {std::cout << "default ctor\n";}
logged_creation(const logged_creation &) {std::cout << "copy ctor\n";}
logged_creation(logged_creation &&) {std::cout << "move ctor\n";}
};
template <typename T>
class foo
{
public:
void func(T val)
{
T v = std::move(val);
}
};
int main()
{
foo<logged_creation> f;
std::cout << "RValue: \n";
f.func(logged_creation());
std::cout << "LValue: \n";
logged_creation i;
f.func(i);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgbG9nZ2VkX2NyZWF0aW9uCnsKcHVibGljOgogICAgbG9nZ2VkX2NyZWF0aW9uKCkge3N0ZDo6Y291dCA8PCAiZGVmYXVsdCBjdG9yXG4iO30KICAgIGxvZ2dlZF9jcmVhdGlvbihjb25zdCBsb2dnZWRfY3JlYXRpb24gJikge3N0ZDo6Y291dCA8PCAiY29weSBjdG9yXG4iO30KICAgIGxvZ2dlZF9jcmVhdGlvbihsb2dnZWRfY3JlYXRpb24gJiYpIHtzdGQ6OmNvdXQgPDwgIm1vdmUgY3RvclxuIjt9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgZm9vCnsKcHVibGljOgogICAgdm9pZCBmdW5jKFQgdmFsKQogICAgewogICAgICAgIFQgdiA9IHN0ZDo6bW92ZSh2YWwpOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBmb288bG9nZ2VkX2NyZWF0aW9uPiBmOwogICAgc3RkOjpjb3V0IDw8ICJSVmFsdWU6IFxuIjsKICAgIGYuZnVuYyhsb2dnZWRfY3JlYXRpb24oKSk7CiAgICBzdGQ6OmNvdXQgPDwgIkxWYWx1ZTogXG4iOwogICAgbG9nZ2VkX2NyZWF0aW9uIGk7CiAgICBmLmZ1bmMoaSk7Cn0K