在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);
}
在这种情况下,模板参数推导是否会起作用?换句话说,模板别名是被推导的上下文还是非推导的上下文?还是它们继承了它们所别名的任何东西的推断/非推断状态?
template <typename T> void f(typename A<T>::type);
一样,这不能被推导出来。 - Kerrek SB