Por que o nome do tipo _não_ é necessário aqui no Visual Studio 2008/2010?

Emessa questã, o autor da pergunta tem a seguinte função:

template<typename ITER>
bool nextPermutation(ITER start, ITER end)
{
    return nextPermutation(start, end, std::iterator_traits<ITER>::iterator_category());
}

Por que não é umtypename necessário antes dostd::iterator_traits? Eu pensei que era necessário para tipos aninhados de um modelo, se o modelo é dependente de um parâmetro de modelo em si? O GCC parece apoiar minha ideia, pois não é compilado nos dois 4.3.4 e 4.5.1, exigindo umtypename. Mesmo assim, ele ainda compila muito bem no Visual Studio 2008 e 2010.
Essa é apenas outra extensão / bug do Visual Studio que eu não conheço?
Ou é realmente possível deduzir queiterator_category é um tipo ou uma função porque é seguido por um par parêntese()? (Veja as mensagens de @ DeadGM começando aqui.) Então isso é realmente um bug no GCC?

questionAnswers(2)

yourAnswerToTheQuestion