Частичная специализация с пакетом параметров ведет себя иначе, чем расширенная вручную - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь понять, почему я получаю другое поведение с двумя шаблонами, которые должны быть эквивалентны мне

Учитывая

template<template<typename...> class TT, typename T1, typename T2>
class A {};

is_a является универсальной версией

template<typename T>
struct is_a : std::false_type
{
};

template<template<typename...> class TT, typename... T>
struct is_a<A<TT, T...>> : std::true_type
{
};

is_a2 - это версия, которая была вручную расширена до 2 типов вместо пакета параметров

template<typename T>
struct is_a2 : std::false_type
{
};

template<template<typename...> class TT, typename T1, typename T2>
struct is_a2<A<TT, T1, T2>> : std::true_type
{
};

Я бы ожидал, что 2 версии будут вести себя одинаково, когда A создается с 3 параметрами, но это не так

См. Код компиляции https://wandbox.org/permlink/MjSwFLvWmH0n1QLk

Я бы ожидал, что is_a будет работать где угодно is_a2 работает.

Это ошибка компилятора, о которой я должен сообщить?

EDIT

Видимо, это работает в Clang https://wandbox.org/permlink/9n5pXUGtBa8cAvFw

...