
I haven't checked this, but it's the behavior that I would expect.
That seems surprising to me. It's a simple alias here, so I would expect it to be exactly that -- an alias. If I make a typedef of a type, I expect it to alias that type such that is_same tells me that are the same (which it, of course, does). An alias should, whenever possible, be exactly that, an alias.
Suppose you have an alias of the form template <typename T> using alias = typename some_metafunction<T>::type; It could very well be that some_metafunction<T>::type is foo<T> for all types T (where foo is some class template), but it's undecidable for the compiler to determine that in the general case. So, in the general case, it is not reasonable to expect a compiler to deem 'alias' and 'foo', as template *template* parameters, to be equal (of course for any T, the template *type* parameters alias<T> and foo<T> *will* be equal). Given that this is the case, it would be strange if, as a special case, the compiler did deem 'alias' and 'foo', as template template parameters, to be equal if 'alias' happened to be defined as follows: template <typename T> using alias = foo<T>; I think the behaviour you're experiencing, while undesirable for your particular use case, is consistent. Regards, Nate