Question

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.

Was it helpful?

Solution

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
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top