C++ 混合传递引用和传递值到可变模板函数有效吗?
我有一个方法,它为一个对象分配内存,然后调用它的构造函数——内存分配器C++ 混合传递引用和传递值到可变模板函数有效吗?,c++,templates,c++11,variadic-templates,placement-new,C++,Templates,C++11,Variadic Templates,Placement New,我有一个方法,它为一个对象分配内存,然后调用它的构造函数——内存分配器 template <class T, typename... Arguments> inline T* AllocateObject(Arguments... args) { return new (InternalAllocate(sizeof(T))) T(args...); } 模板 内联T*AllocateObject(参数…参数){返回新的(内部分配(sizeof(T)))T(参数…)} 使用此函数
template <class T, typename... Arguments>
inline T* AllocateObject(Arguments... args) { return new (InternalAllocate(sizeof(T))) T(args...); }
模板
内联T*AllocateObject(参数…参数){返回新的(内部分配(sizeof(T)))T(参数…)}
使用此函数混合按值传递和按引用传递是否有效?例如,为一个类分配一个构造函数,其中一些是按值分配的,另一些是按引用分配的。它可以编译,但我不确定它是否有任何令人讨厌的副作用。您想要的是完美的转发,即您的
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
}
模板
内联T*分配对象(参数和参数)
//^^通用参考文献
{
返回新的(InternalAllocate(sizeof(T)))T(std::forward(args)…);
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^转发
}
您可能应该使用T(std::forward(args)…
,但除此之外,您应该很好。是的,我确实忘记了&&
,这对于完美的转发很重要;)旁注:到目前为止,通用引用已重命名为“转发引用”。