#include <iostream>
#include <memory>
#include <utility>
struct A {
A(int&& n) { std::cout << "rvalue overload, n=" << n << "\n"; }
A(const int& n) { std::cout << "const overload, n=" << n << "\n"; }
A(int& n) { std::cout << "lvalue overload, n=" << n << "\n"; }
};
class B {
public:
template<class T1, class T2, class T3>
B(T1&& t1, T2&& t2, T3&& t3) :
a1_{std::forward<T1>(t1)},
a2_{std::forward<T2>(t2)},
a3_{std::forward<T3>(t3)}
{
}
private:
A a1_, a2_, a3_;
};
template<class T, class U>
std::unique_ptr<T> make_unique1(U&& u)
{
return std::unique_ptr<T>(new T(std::forward<U>(u)));
}
template<class T, class... U>
std::unique_ptr<T> make_unique2(U&&... u)
{
return std::unique_ptr<T>(new T(std::forward<U>(u)...));
}
int main()
{
auto p1 = make_unique1<A>(2); // rvalue
int i = 1;
auto p2 = make_unique1<A>(i); // lvalue
std::cout << "B\n";
const int& j = i;
auto t = make_unique2<B>(2, i, j);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dXRpbGl0eT4KCnN0cnVjdCBBIHsKICAgIEEoaW50JiYgbikgeyBzdGQ6OmNvdXQgPDwgInJ2YWx1ZSBvdmVybG9hZCwgbj0iIDw8IG4gPDwgIlxuIjsgfQogICAgQShjb25zdCBpbnQmIG4pIHsgc3RkOjpjb3V0IDw8ICJjb25zdCAgb3ZlcmxvYWQsIG49IiA8PCBuIDw8ICJcbiI7IH0KICAgIEEoaW50JiBuKSAgeyBzdGQ6OmNvdXQgPDwgImx2YWx1ZSBvdmVybG9hZCwgbj0iIDw8IG4gPDwgIlxuIjsgfQp9OwogCmNsYXNzIEIgewpwdWJsaWM6CiAgICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzPgogICAgQihUMSYmIHQxLCBUMiYmIHQyLCBUMyYmIHQzKSA6CiAgICAgICAgYTFfe3N0ZDo6Zm9yd2FyZDxUMT4odDEpfSwKICAgICAgICBhMl97c3RkOjpmb3J3YXJkPFQyPih0Mil9LAogICAgICAgIGEzX3tzdGQ6OmZvcndhcmQ8VDM+KHQzKX0KICAgIHsKICAgIH0KIApwcml2YXRlOgogICAgQSBhMV8sIGEyXywgYTNfOwp9OwogCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+CnN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlX3VuaXF1ZTEoVSYmIHUpCnsKICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPFU+KHUpKSk7Cn0KIAp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcy4uLiBVPgpzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZV91bmlxdWUyKFUmJi4uLiB1KQp7CiAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQ+KG5ldyBUKHN0ZDo6Zm9yd2FyZDxVPih1KS4uLikpOwp9CiAKaW50IG1haW4oKQp7ICAgCiAgICBhdXRvIHAxID0gbWFrZV91bmlxdWUxPEE+KDIpOyAvLyBydmFsdWUKICAgIGludCBpID0gMTsKICAgIGF1dG8gcDIgPSBtYWtlX3VuaXF1ZTE8QT4oaSk7IC8vIGx2YWx1ZQogCiAgICBzdGQ6OmNvdXQgPDwgIkJcbiI7CiAgICBjb25zdCBpbnQmIGogPSBpOwogICAgYXV0byB0ID0gbWFrZV91bmlxdWUyPEI+KDIsIGksIGopOwp9