При использовании псевдонимов шаблонов в качестве аргументов шаблонных классов, объявляющих частичные специализации, я получаю несколько неожиданные результаты.В некоторых случаях я даже замечаю, что GCC 8.2 и Clang 6.0.0 не согласуются с результатами.Код, иллюстрирующий мои случаи, может быть найден ниже.
// A template struct named Foo.
template<typename>
struct Foo {};
// A template alias for type Foo.
template<typename TYPE>
using AliasFoo = Foo<TYPE>;
// A variadic template alias for type Foo.
template<typename... ARGS>
using VariadicAliasFoo = Foo<ARGS...>;
// A template struct named Bar.
template<template<typename...> class TEMPLATE, typename TYPE>
struct Bar
{
static constexpr bool value = false;
};
// Partial specialization of template struct Bar.
template<template<typename...> class TEMPLATE, typename... ARGS>
struct Bar< TEMPLATE, TEMPLATE<ARGS...> >
{
static constexpr bool value = true;
};
// The main function.
int main()
{
// These compile time assertions are satisfied (as expected).
static_assert(Bar<Foo, Foo<int> >::value, "");
static_assert(Bar<Foo, AliasFoo<int> >::value, "");
static_assert(Bar<Foo, VariadicAliasFoo<int> >::value, "");
// These compile time assertions fails with Clang 6.0.0 but succeed with GCC 8.2
static_assert(Bar<AliasFoo, Foo<int> >::value, "");
static_assert(Bar<AliasFoo, AliasFoo<int> >::value, "");
static_assert(Bar<AliasFoo, VariadicAliasFoo<int> >::value, "");
// These compile time assertions fails with Clang 6.0.0 and GCC 8.2.
static_assert(Bar<VariadicAliasFoo, Foo<int> >::value, "");
static_assert(Bar<VariadicAliasFoo, AliasFoo<int> >::value, "");
static_assert(Bar<VariadicAliasFoo, VariadicAliasFoo<int> >::value, "");
// Always return zero.
return 0;
}
Мой вопрос следующий, согласно стандарту (c ++ 17), что должно быть результатом последних шести утверждений времени компиляции в приведенном выше коде