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