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
?