基元类型的完美转发
Perfect forwarding of primitive types
我需要为自己的数据结构实现一些类似于vector::emplace
的方法。在一般情况下,我会实现它们,以便它们支持完美的转发,即使用右值引用、std::forward
等。
但是,如果我知道所有要转发的参数都是基元类型,如int
或float
,该怎么办。为基元类型实现完美转发有意义吗?
换句话说,假设我们只使用基元类型作为模板参数,下面两个代码片段之间有区别吗?
template <typename... Args>
void wrapper(Args&& ... args) {
func(std::forward<Args>(args)...);
}
和
template <typename... Args>
void wrapper(Args ... args) {
func(args...);
}
另外:如果我们知道模板参数只能是只包含基元类型的类,这有什么区别吗?或者只包含基元类型的类和其他本身只包含基元类型的类?
不,对基本类型使用完美转发绝对没有任何意义:
- 复制相当于移动它们
- 复制它们的成本与通过引用传递的成本大致相同或更低(由于其他优化,尤其是指针别名)
- 最好的代码是不存在的代码
不过有一个例外:
无法避免引用输出参数。
此外,如果你无论如何都在写一个模板,你绝对确定你永远不想把它用于更复杂的类型吗
YAGNI(你不需要它)非常重要,但不要因为不必要地限制你的界面而妨碍你自己。
永远记住一句古老的格言"过早优化是万恶之源"。
相关文章:
- 将函数参数完美转发到函数指针:按值传递呢?
- C++20理念:要求表达和完美转发
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 返回值的完美转发?
- 使用衰减与完美转发
- 可变参数模板:将整数参数完美转发到 lambda
- 完美转发C++重载和模板化函子及其参数
- 在完美转发中需要衰减
- C++完美转发:如何避免悬空引用
- 无法理解一段具有完美转发和省略号的C++代码
- 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?
- 完美转发可变参数模板模板
- 在完美转发函数中公开参数类型,避免代码重复
- 使用完美转发的模板转换构造函数
- 完美转发使用结构化绑定声明的变量
- 完美转发常量参数以进行持续评估
- 使用auto&&完美转发返回值
- 完美转发可变参数模板参数到成员函数
- 无需使用 ODR 即可实现完美转发
- 使用模板类完美转发