Является ли значение параметра шаблона шаблона по умолчанию выводимым контекстом?
Я был действительно удивлен, что и 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
можно вывести.