Является ли значение параметра шаблона шаблона по умолчанию выводимым контекстом?

Я был действительно удивлен, что и gcc, и clang принимают этот код:

#include <iostream>
#include <vector>
#include <type_traits>

template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y>) {
}

int main() {
    static_assert(std::is_same<decltype(foo(std::vector<int>{})), std::allocator<int>>::value);
}

Правы ли gcc и clang в том, что значения параметров шаблона шаблона по умолчанию выводятся из контекста или это расширение компиляторов?

1 ответ

Решение

Когда ты пишешь

template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y>);

это эквивалентно

template <class T, template <class, class = T> class TT, class Y>
T foo(TT<Y, T>);

Так T можно вывести.

Другие вопросы по тегам