3
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

4

1 回答 1

4

编译器从函数签名而不是函数中推断出参数类型。

由于T根本没有在函数签名中使用(void reverse2(Bi begin, Bi end)),编译器无法推断类型。但是,在swap它可以推导出类型的情况下,因为它是在函数签名中推导出来的。

于 2012-07-01T12:15:02.173 回答