我需要实现一些类似的方法vector::emplace
对于我自己的数据结构。在一般情况下,我会实现它们,以便它们支持完美转发,即使用右值引用,std::forward
还有那些东西。
但是,如果我知道要转发的所有参数都是原始类型,例如int
or float
。为原始类型实现完美转发有意义吗?
换句话说,假设我们只使用基本类型作为模板参数,下面的两个代码片段之间有区别吗?
template <typename... Args>
void wrapper(Args&& ... args) {
func(std::forward<Args>(args)...);
}
and
template <typename... Args>
void wrapper(Args ... args) {
func(args...);
}
另外:如果我们知道模板参数只能是仅包含原始类型的类,会有什么区别吗?或者仅包含原始类型的类和其他本身仅包含原始类型的类?
不,对于基本类型使用完美转发绝对没有任何意义:
- 复制相当于移动它们。
- 复制它们的成本与通过引用传递的成本大致相同或更少(由于其他优化,尤其是指针别名)。
- 最好的代码是不存在的代码。
但有一个例外:
无法避免通过引用获取输出参数。
另外,如果您无论如何都在编写模板,您是否绝对确定您永远不想将其与更复杂的类型一起使用?
YAGNI(你不会需要它)非常重要,但不要通过不必要地限制你的界面来妨碍自己也很重要。
永远记住一句古老的格言“过早的优化是万恶之源”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)