#include <vector>
#include <string>
#include <iostream>
#include <iomanip>

using namespace std;

struct tmpS {
    tmpS() {}
    tmpS(const tmpS&) {
        std::cout << "copy\n";
    }
    tmpS(tmpS&&) {
        std::cout << "move\n";
    }
};

template<typename Type>
void pass_to_construct(Type&& arg) { // универсальная ссылка
    tmpS t = std::forward<Type>(arg);
}

template<typename T>
struct v {
    v() {}
    void push_back(T&& value) { // вызовется эта перегрузка
        pass_to_construct(std::forward<T&&>(value));
    }
    void push_back(T& value) { // вызовется эта перегрузка
        pass_to_construct(std::forward<T&>(value));
    }
};

int main()
{
    v<tmpS> s;
    tmpS t;
    s.push_back(tmpS()); // rvalue
    s.push_back(t);      // lvalue
}

