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
それに応じて選択できないのはなぜですか?