在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);
}
模板参数推导会在这种情况下起作用吗?换句话说,模板别名是推导的上下文还是非推导的上下文?或者他们是否继承了别名的推导/非推断状态?