В С++ 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>
- выведенный контекст.
В С++ 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);
}
Будет ли в этом случае работать с аргументом шаблона? Другими словами, являются ли псевдонимы шаблонов выведенным контекстом или не выводимым контекстом? Или они наследуют выведенный/не выводимый статус того, что они называют?