#include <iostream>
using namespace std;
template<class T, class... Args>
T* make_ptr( Args... args )
{
return new T( args... );
}
template<class T, class... Args>
T* make_ptr_fwd( Args... args )
{
return new T( forward<Args>( args )... );
}
struct Val {};
struct C {
C( const Val& v ) { cout << "C( const Val& )" << endl; }
C( Val&& ) { cout << "C( Val&& )" << endl; }
};
int main() {
cout << ">>> make_ptr:" << endl;
C* c1 = make_ptr<C>( Val() );
cout << ">>> make_ptr_fwd:" << endl;
C* c2 = make_ptr_fwd<C>( Val() );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MuLi4gQXJncz4KVCogbWFrZV9wdHIoIEFyZ3MuLi4gYXJncyApCnsKCXJldHVybiBuZXcgVCggYXJncy4uLiApOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPgpUKiBtYWtlX3B0cl9md2QoIEFyZ3MuLi4gYXJncyApCnsKCXJldHVybiBuZXcgVCggZm9yd2FyZDxBcmdzPiggYXJncyApLi4uICk7Cn0KCnN0cnVjdCBWYWwge307CgpzdHJ1Y3QgQyB7CglDKCBjb25zdCBWYWwmIHYgKSB7IGNvdXQgPDwgIkMoIGNvbnN0IFZhbCYgKSIgPDwgZW5kbDsgfQoJQyggVmFsJiYgKSB7IGNvdXQgPDwgIkMoIFZhbCYmICkiIDw8IGVuZGw7IH0KfTsKCmludCBtYWluKCkgewoJY291dCA8PCAiPj4+IG1ha2VfcHRyOiIgPDwgZW5kbDsKCUMqIGMxID0gbWFrZV9wdHI8Qz4oIFZhbCgpICk7CgkKCWNvdXQgPDwgIj4+PiBtYWtlX3B0cl9md2Q6IiA8PCBlbmRsOwoJQyogYzIgPSBtYWtlX3B0cl9md2Q8Qz4oIFZhbCgpICk7Cn0=