以下のコードなのですがtemplateの方の関数でreturn sunto<n - 1>();とありますがそれはtempalte<int n>のほうの関数をまた使ってるのでしょうか。一方template<>のほうはどこで利用されるのでしょうか?template<>関数をコメントにするとint array3のほうでエラーになります。 coutでいつ使われてるか確認しようとしましたがエラーになるので使えませんでした。名前が同じなので混乱しています、解説をお願いしたいです。

template<int n> constexpr int sunto() {
    return n + sunto<n - 1>();
}

template<> constexpr int sunto<0>(){
    //cout << "template<>を使用\n";
    return 0;
}

int array3[sunto<3>()];

int main() {
    size_t t = sizeof(array3);
    for (size_t i = 0; i < t; i++) {
        cout << i<<'\n';
    }
    cout << t;

    _getch();
    return 0;
}