为什么模板会创建第二个参数的本地副本?

时间:2017-03-17 09:57:09

标签: c++ templates

正在浏览模板。传递两个模板参数的方法是:

template <typename T1, typename T2>
inline T1 max (T1 const& a, T2 const& b) {
  return a < b ? b : a;
}
…
max(4,4.2) // OK, but type of first argument defines return type

这有两个缺点:

  1. 无论来电者的意图如何,其他参数(T2)的参数都可能会转换为此类型。

  2. 将第二个参数的类型转换为返回类型会创建一个新的本地临时对象。

  3. 我理解第一个而不是第二个。在第二点的背景下真正发生了什么?

2 个答案:

答案 0 :(得分:3)

如果a < b为真,则返回b。但是,需要将其从T2转换为T1。这需要一个副本(在简单的情况下可以优化)。

答案 1 :(得分:1)

它会复制,因为您按值返回。毕竟,模板类型最终就像普通类型一样。

如果您想要返回const引用,请返回const T1&,但这会将T2限制为T1

我们可以做更复杂的模板来覆盖这两种情况,并在类型不同时按值返回,但如果没有则返回const ref,但这可能超出了练习的范围