template <class T>
void swap(T &t1, T &t2)
{
T tmp = t1;
t1 = t2;
t2 = tmp;
}
template <class Bi>
void reverse(Bi begin, Bi end)
{
while (begin != end) {
--end;
if (begin != end) {
::swap(*begin++, *end);
}
}
}
为什么上述工作?
template <class Bi, class T>
void reverse2(Bi begin, Bi end)
{
while (begin != end) {
--end;
if (begin != end) {
T tmp = *begin;
*begin++ = *end;
*end = tmp;
}
}
}
虽然这不是吗?
对于第一个工作示例,编译器必须能够在编译时推导出交换函数的参数类型。 (即它必须能够确定*begin++
和*end
的类型。)如果可能,为什么编译器不能推断*begin
返回的值的类型第二个例子并相应地选择T
?
答案 0 :(得分:4)
编译器从函数签名中推断出参数类型,而不是函数 body 。
由于T
未在函数签名中使用(void reverse2(Bi begin, Bi end)
),因此编译器无法推断出类型。但是,在swap
的情况下,它可以推断出类型,因为它是在函数签名中推导出来的。