【问题标题】:Mixing pass-by-reference and pass-by-value to variadic template function valid?将传递引用和传递值混合到可变参数模板函数有效吗?
【发布时间】:2013-10-26 23:20:19
【问题描述】:

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

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

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

【问题讨论】:

  • 你应该使用T(std::forward&lt;Arguments&gt;(args)...),但除此之外你应该没问题。

标签: c++ templates c++11 variadic-templates placement-new


【解决方案1】:

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

【讨论】:

  • 是的,我确实忘记了&amp;&amp;,这对于完美转发很重要;)
  • 旁注:Universal References 现已重命名为“Forwarding References”。
猜你喜欢
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多