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は2番目の例で返される値のタイプを推測してTそれに応じて選択できないのはなぜですか?

4

1 に答える 1

4

コンパイラーは、関数本体ではなく、関数シグニチャーから引数タイプを推測します。

T関数シグニチャ()ではまったく使用されていないため、void reverse2(Bi begin, Bi end)コンパイラは型を推測できません。ただし、この場合swap、関数シグネチャで推定されたため、型を推定できます。

于 2012-07-01T12:15:02.173 に答える