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
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top