Почему эта функция шаблона работает нормально, когда она объявлена в MSVC

#visual-c

Вопрос:

при компиляции существующего кода с использованием GCC я получил ошибку non-class, non-variable partial specialization ‘make_buffer<size>’ is not allowed .

Сводный код будет выглядеть так (один cpp):

 #include <array>
template <typename T, size_t size>
std::array<T, size> make_typed_buffer()
{
    return std::array<T, size>();
}

template <size_t size>
std::array<char, size> make_buffer();

template <size_t size>
std::array<char, size> make_buffer<size>()
{
    return make_typed_buffer<char, size>();
}
 

Этот код прекрасно компилируется с MSVC 19.29.30038.1, но не с GCC.

Когда я удаляю прямое объявление функции шаблона:

 #include <array>
template <typename T, size_t size>
std::array<T, size> make_typed_buffer()
{
    return std::array<T, size>();
}

//template <size_t size>
//std::array<char, size> make_buffer();

template <size_t size>
std::array<char, size> make_buffer<size>()
{
    return make_typed_buffer<char, size>();
}
 

Я получаю ошибку unrecognizable template declaration/definition (чего я и ожидал в первую очередь). Почему компилятор в порядке с прямым объявлением, но не без него, и, может быть, почему это вообще нормально в первую очередь?

Заранее спасибо, хорошего дня 🙂

Комментарии:

1. Является ли это недокументированным расширением Microsoft?

2. @AdrianMole После прочтения docs.microsoft.com/en-us/cpp/build/reference/… интересно, может ли это быть частью Use of benign typedef redefinitions within the same scope