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

В 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 :: type , не является выведенный контекст.

Если бы я написал функцию так:

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);
}

Будет ли работать вывод аргументов шаблона в этом случае? Другими словами, являются ли псевдонимы шаблонов выводимым контекстом или невыявленным контекстом? Или они наследуют выведенный / невыведенный статус того, что они называют псевдонимом?

12
задан HC4 - reinstate Monica 8 January 2012 в 03:39
поделиться