I have a method which allocates memory for a object and then calls its constructor - a memory allocator.
template <class T, typename... Arguments>
inline T* AllocateObject(Arguments... args) { return new (InternalAllocate(sizeof(T))) T(args...); }
Is it valid using this function to mix pass-by-value and pass-by-reference? For example allocating a class with a constructor with some by-value and some by-reference. It compiles, but I'm not sure if it has any nasty side-effects or not.
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With