Псевдоним шаблона C ++ и частичная специализация класса шаблона - PullRequest
0 голосов
/ 24 августа 2018

При использовании псевдонимов шаблонов в качестве аргументов шаблонных классов, объявляющих частичные специализации, я получаю несколько неожиданные результаты.В некоторых случаях я даже замечаю, что 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), что должно быть результатом последних шести утверждений времени компиляции в приведенном выше коде

...