Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 混合传递引用和传递值到可变模板函数有效吗?_C++_Templates_C++11_Variadic Templates_Placement New - Fatal编程技术网

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)…
,但除此之外,您应该很好。是的,我确实忘记了
&&
,这对于完美的转发很重要;)旁注:到目前为止,通用引用已重命名为“转发引用”。