怎么会?特征中未检测到别名

Ger*_*ago 4 c++ templates variadic-templates c++11 type-alias

问题很简单:看看代码.两个静态断言都通过了.我不希望第二个通过.这是一个错误还是正常行为?

#include <array>
#include <type_traits>

template <template <class...> class Temp, class Specialization>
struct IsSpecialization : std::false_type {};

template <template <class...> class Temp, class... Ts>
struct IsSpecialization<Temp, Temp<Ts...>> : std::true_type {};

template <class...Args>
struct A {};

template <class...Args>
using AT = A<Args...>;


int main() {
    static_assert(IsSpecialization<A, A<int>>{});
    static_assert(!IsSpecialization<AT, AT<int>>{});
}
Run Code Online (Sandbox Code Playgroud)

T.C*_*.C. 6

Temp 当您尝试匹配部分特化时,会推断两次:

  • 通过匹配Temp反对AT.这简单地推断TempAT.
  • 通过匹配Temp<Ts...>反对AT<int>.这推断TempA因为AT<int>相当于A<int>,并且这种推论永远不会推断出别名模板(参见[temp.alias]/2).

整体扣除成功 - 部分专业化是匹配 - 如果两个扣除给出Temp相同的值,即iff ATA被认为是等价的.它们是否是一个悬而未决的问题.