Почему "a.template foo <0>();" разрешено даже при том, что "a.foo <0>();" достаточно?

struct A
{
    template<int>
    void foo()
    {}
};

int main()
{
    A a;
    a.foo<0>(); // ok
    a.template foo<0>(); // also ok
}

Очевидно, a.foo<0>(); более кратким, интуитивным и выразительным, чем a.template foo<0>(); ,

Почему C++ разрешает a.template foo<0>(); даже если a.foo<0>(); достаточно?

Ответ 1

Иногда внутри шаблона вам нужно написать a.template foo<0>() вместо a.foo<0>().

@melpomene дал этот замечательный пример в комментариях:

template<typename T>
void do_stuff() {
  T a;
  a.template foo<0>();
}
do_stuff<A>();

  • В С++ 03, a.template foo<0>() не следует использовать в вашей текущей ситуации.

g++ выдаст следующее предупреждение при компиляции вашего кода:

предупреждение: ключевое слово 'template' за пределами шаблона [-WС++ 11-extensions]

  • В С++ 11 грамматика была упрощена, позволяя везде использовать синтаксис a.template foo<0>().