基元类型的完美转发

Perfect forwarding of primitive types

本文关键字:完美 转发 类型      更新时间:2023-10-16

我需要为自己的数据结构实现一些类似于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(你不需要它)非常重要,但不要因为不必要地限制你的界面而妨碍你自己。

永远记住一句古老的格言"过早优化是万恶之源"。