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

Mixing pass-by-reference and pass-by-value to variadic template function valid?

本文关键字:参数 函数 有效 变参 按引用传递 按值传递 混合      更新时间:2023-10-16

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

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

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

您正在寻找的是完美的转发,即就复制副作用而言,您的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
}