Равенство шаблонных псевдонимов - PullRequest
10 голосов
/ 06 мая 2019

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

Итак, я создаю черты для проверки, когда 2 шаблона (не типы) равны:

template <template <class...> class C1,
          template <class...> class C2>
struct is_same_template : std::false_type {};

template <template <class...> class C1>
struct is_same_template<C1, C1> : std::true_type {};

Теперь проверьте это:

// Expected alias
template <typename ... Ts> using V_Ts = std::vector<Ts...>;    // Variadic
// Fallback alias
template <typename T, typename A> using V = std::vector<T, A>; // Exact count

static_assert(!is_same_template<std::vector, V_Ts>::value); // Alias rejected by gcc/clang
static_assert( is_same_template<std::vector, V>::value);    // Alias accepted only for gcc

Демо

Можно ли создать "настоящий" псевдоним? какой компилятор прав?

1 Ответ

5 голосов
/ 06 мая 2019

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

Я не думаю, что это в настоящее время возможно. К сожалению, псевдонимов шаблонов нет, есть только шаблоны псевдонимов. И шаблон псевдонима всегда является собственным шаблоном [temp.alias] / 1 . Специализация шаблона псевдонима эквивалентна типу, который вы получаете, подставляя аргументы шаблона в шаблон псевдонима, но сам шаблон псевдонима не является псевдонимом для другого шаблона [temp.alias] / 2 . Я бы посоветовал GCC позволить вашей второй static_assert пройти ошибку в GCC & hellip;

Как отметил @HolyBlackCat в комментарии выше, есть связанный вопрос и ответ , который указывает на многочисленные связанные с CWG проблемы. В частности, одна проблема ( CWG 1286 ), по-видимому, предполагает, что существует желание позволить шаблону псевдонима самому себе быть эквивалентным шаблону, на который он ссылается при определенных обстоятельствах. Однако, похоже, что предложенная резолюция не была принята из-за проблем, поднятых позже. Соответствующая формулировка в текущем проекте стандарта ( [temp.alias] и [temp.type] ), по-видимому, не отличается от C ++ 11…

...