完美转发原始类型

时间:2015-02-20 18:38:18

标签: c++ move rvalue-reference primitive-types perfect-forwarding

我需要为自己的数据结构实现一些类似于vector::emplace的方法。在一般情况下,我会实现它们,以便它们支持完美转发,即使用rvalue-references,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 个答案:

答案 0 :(得分:4)

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

  1. 复制相当于移动它们。
  2. 复制它们的成本大致相同或更低(由于其他优化,尤其是指针别名),而不是通过引用传递。
  3. 最好的代码是不存在的代码。
  4. 但有一个例外:
    无法通过引用来避免输出参数。

    另外,如果你正在编写模板,你绝对相信你永远不会想要用更复杂的类型吗?
    YAGNI(你不需要它)非常重要,但不会因为不必要地限制你的界面而妨碍自己。

    永远记住古老的格言“过早优化是万恶之源”。