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

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


person W.F.    schedule 07.12.2016    source источник


Ответы (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 можно вывести.

person Jarod42    schedule 07.12.2016
comment
Это имеет смысл, однако это все еще выглядит как уловка компилятора, гарантируется ли это стандартом? - person W.F.; 08.12.2016
comment
@В.Ф. Может быть, это подразумевается из § 14.3.3/3? (N4296) - person AndyG; 08.12.2016
comment
@AndyG похоже, это может объяснить это, позвольте мне проанализировать это немного подробнее ... - person W.F.; 08.12.2016
comment
@AndyG Я не уверен. Мое понимание фрагмента заключается в том, что параметр шаблона шаблона соответствует, если классы параметров шаблона совпадают... Я думаю, что это относится к параметрам шаблона типа/шаблона/нетипового шаблона и никаким значениям по умолчанию любого типа. параметры... но я мог неправильно понять этот фрагмент, так как я не местный... :( - person W.F.; 08.12.2016