В 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
, не является выведенный контекст.
Если бы я написал функцию так:
template <typename T> struct B {};
template <typename T>
void f(B<T>);
int main()
{
B<int> b;
f(b);
}
все в порядке, потому что B
является выведенным контекстом.
В 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);
}
Будет ли работать вывод аргументов шаблона в этом случае? Другими словами, являются ли псевдонимы шаблонов выводимым контекстом или невыявленным контекстом? Или они наследуют выведенный / невыведенный статус того, что они называют псевдонимом?