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)
Temp 当您尝试匹配部分特化时,会推断两次:
Temp反对AT.这简单地推断Temp为AT.Temp<Ts...>反对AT<int>.这推断Temp是A因为AT<int>相当于A<int>,并且这种推论永远不会推断出别名模板(参见[temp.alias]/2).整体扣除成功 - 部分专业化是匹配 - 如果两个扣除给出Temp相同的值,即iff AT和A被认为是等价的.它们是否是一个悬而未决的问题.