What you're looking for is perfect forwarding, ie. your AllocateObject
function should be completely transparent as far as copying side effects are concerned.
This involves both std::forward
(as nijansen already mentioned) and the use of universal references in your parameter list:
template <class T, typename... Arguments>
inline T* AllocateObject(Arguments&&... args)
// ^^ universal references
{
return new (InternalAllocate(sizeof(T))) T(std::forward<Arguments>(args)...);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ forwarding
}