В C ++ 03 вычитание параметра шаблона не происходит в некоторых контекстах.Например:
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
void f(typename A<T>::type);
int main()
{
B<int> b;
f(b); // ERROR: no match
}
Здесь int
не выводится для T
, потому что вложенный тип, такой как A<T>::type
, представляет собой не выводимый контекст.
Написал ли яфункция выглядит следующим образом:
template <typename T> struct B {};
template <typename T>
void f(B<T>);
int main()
{
B<int> b;
f(b);
}
все в порядке, потому что B<T>
является выведенным контекстом.
В C ++ 11, однако, псевдонимы шаблона могут бытьиспользуется для маскировки вложенного типа в синтаксисе, аналогичном второму примеру.Например:
template <typename T> struct B {};
template <typename T>
struct A
{
typedef B<T> type;
};
template <typename T>
using C = typename A<T>::type;
template <typename T>
void f(C<T>);
int main()
{
B<int> b;
f(b);
}
В этом случае сработает ли вычет аргумента шаблона?Другими словами, являются ли псевдонимы шаблонов выводимым контекстом или не выводимым контекстом?Или они наследуют выведенный / не выведенный статус любого псевдонима?