将按引用传递和按值传递混合到可变参数模板函数是否有效?

Kai*_*aan 6 c++ templates placement-new variadic-templates c++11

我有一个方法,为一个对象分配内存,然后调用它的构造函数 - 一个内存分配器.

template <class T, typename... Arguments>
inline T* AllocateObject(Arguments... args) { return new (InternalAllocate(sizeof(T))) T(args...); }
Run Code Online (Sandbox Code Playgroud)

使用此函数混合传值和传递引用是否有效?例如,使用带有一些by-value和一些by-reference的构造函数分配一个类.它编译,但我不确定它是否有任何令人讨厌的副作用.

sya*_*yam 5

您正在寻找的是完美的转发,即.AllocateObject就复制副作用而言,你的功能应该是完全透明的.

这包括std::forward(如nijansen已经提到的)和参数列表中通用引用的使用:

template <class T, typename... Arguments>
inline T* AllocateObject(Arguments&&... args)
//                                ^^ universal references
{
    return new (InternalAllocate(sizeof(T))) T(std::forward<Arguments>(args)...);
    //                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ forwarding
}
Run Code Online (Sandbox Code Playgroud)