原始类型的完美转发

Perfect forwarding of primitive types

我需要为我自己的数据结构实现一些类似于vector::emplace的方法。在一般情况下,我会实现它们以便它们支持完美转发,即使用右值引用、std::forward 和那些东西。

但是,如果我知道要转发的所有参数都是基本类型,例如 intfloat,会怎样呢?为原始类型实现完美转发是否有意义?

换句话说,假设我们只使用原始类型作为模板参数,下面两个代码片段有区别吗?

template <typename... Args>
void wrapper(Args&& ... args) {
   func(std::forward<Args>(args)...);
}

template <typename... Args>
void wrapper(Args ... args) {
   func(args...);
}

另外:如果我们知道模板参数只能是类,只包含原始类型,有什么区别吗?或者 类 只包含原始类型和其他 类 本身只包含原始类型?

不,对基本类型使用完美转发绝对没有任何意义:

  1. 复制等同于移动
  2. 复制它们的成本与通过引用传递的成本相同或更少(由于其他优化,尤其是指针别名)。
  3. 最好的代码是不存在的代码。

不过有一个例外:
无法避免通过引用获取输出参数。

此外,如果您正在编写模板,您是否绝对确定您永远不想将它用于更复杂的类型?
YAGNI(你不需要它)非常重要,但以后不要通过不必要地限制你的界面来妨碍你自己。

永远记住那句老话 "Premature optimization is the root of all evil"。