2013-10-18 17 views
6

我有一个方法为对象分配内存,然后调用它的构造函数 - 内存分配器。混合传递引用和传值的可变参数模板函数是否有效?

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

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

+1

你或许应该使用'T(标准::向前(参数).. ''',但除此之外你应该没问题。 – nijansen

回答

5

你在找什么是完美转发,即。就拷贝副作用而言,你的功能应该是完全透明的。

这既包括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 
} 
+0

是的,我确实忘了''&&,这是一种完美转发重要;) – nijansen

+0

旁注:通用参考资料已经通过,现在更名为“转发引用”。 –

相关问题