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