#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
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgdG1wUyB7CiAgICB0bXBTKCkge30KICAgIHRtcFMoY29uc3QgdG1wUyYpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImNvcHlcbiI7CiAgICB9CiAgICB0bXBTKHRtcFMmJikgewogICAgICAgIHN0ZDo6Y291dCA8PCAibW92ZVxuIjsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+CnZvaWQgcGFzc190b19jb25zdHJ1Y3QoVHlwZSYmIGFyZykgeyAvLyDRg9C90LjQstC10YDRgdCw0LvRjNC90LDRjyDRgdGB0YvQu9C60LAKICAgIHRtcFMgdCA9IHN0ZDo6Zm9yd2FyZDxUeXBlPihhcmcpOwp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgdiB7CiAgICB2KCkge30KICAgIHZvaWQgcHVzaF9iYWNrKFQmJiB2YWx1ZSkgeyAvLyDQstGL0LfQvtCy0LXRgtGB0Y8g0Y3RgtCwINC/0LXRgNC10LPRgNGD0LfQutCwCiAgICAgICAgcGFzc190b19jb25zdHJ1Y3Qoc3RkOjpmb3J3YXJkPFQmJj4odmFsdWUpKTsKICAgIH0KICAgIHZvaWQgcHVzaF9iYWNrKFQmIHZhbHVlKSB7IC8vINCy0YvQt9C+0LLQtdGC0YHRjyDRjdGC0LAg0L/QtdGA0LXQs9GA0YPQt9C60LAKICAgICAgICBwYXNzX3RvX2NvbnN0cnVjdChzdGQ6OmZvcndhcmQ8VCY+KHZhbHVlKSk7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIHY8dG1wUz4gczsKICAgIHRtcFMgdDsKICAgIHMucHVzaF9iYWNrKHRtcFMoKSk7IC8vIHJ2YWx1ZQogICAgcy5wdXNoX2JhY2sodCk7ICAgICAgLy8gbHZhbHVlCn0KCg==