我有一个方法为对象分配内存,然后调用它的构造函数 - 一个内存分配器。
template <class T, typename... Arguments>
inline T* AllocateObject(Arguments... args) { return new (InternalAllocate(sizeof(T))) T(args...); }
使用此函数混合传值和传递引用是否有效?例如,使用带有一些by-value和一些by-reference的构造函数分配一个类。它编译,但我不确定它是否有任何令人讨厌的副作用。
答案 0 :(得分: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
}