Почему шаблонные псевдонимы анонимных структур / классов не могут быть определены напрямую? - PullRequest
6 голосов
/ 27 апреля 2019

Я могу создать следующее:

using Foo = struct { /*Implementation*/ };

template<class>
using Bar = Foo;

Однако следующее не разрешено:

template<class>
using Bar = struct { /*Implementation*/ };

Ошибка от Clang более полезна, чем GCC, и гласит:

ошибка: «(анонимная структура в файл: строка: столбец )» не может быть определена в шаблоне псевдонима типа


Какие-либо причины, по которым второй пример кода не разрешен?

Примечание:

  • Пожалуйста, укажите любые примеры, для которых второй пример кода (если разрешен) может вызвать проблемы с языком.

  • Любая цитата из стандарта также полезна.

1 Ответ

7 голосов
/ 27 апреля 2019

Определение класса или перечисления в объявлении псевдонима , которое является частью псевдонима шаблона, запрещено [dcl.typedef] / 2 :

A typedef-name также может быть введено с помощью объявления псевдонима .

...

Определение type-specier-seq из defining-type-id не должен определять класс или перечисление, если декларация псевдонима является декларацией объекта шаблон декларации .

Последний был представлен как CWG, выпуск 1159 был принят, как часть FCD N3092 .

Комментарии и предлагаемое решение соответствующего комментария N3092 US 74 действительно дает некоторое обоснование того, почему было введено это ограничение [ выделение мое]:

Комментарий (ID) US 74

Комментарий

Объявление псевдонима позволяет определить класс или тип перечисления вего идентификатор типа (7.1.6p3).Однако не ясно, что это желательно, когда объявление псевдонима является частью псевдонима шаблона:

template<typename T> using A =
struct { void f(T) { } };

Предлагаемое разрешение

Либо запретите определение классов и перечислений в шаблонных псевдонимах , либо запретите использование параметров шаблона в таких определениях , либо добавьте пример, иллюстрирующий это использование .

Владелец и выпуск

CWG 1159

Диспозиция

ПРИНЯТО

Определение класса или перечисления теперь запрещено в псевдониме шаблона.

Казалось бы, никто не протестовал (достаточно убедительно) против запрета определения классов и перечислений в псевдонимах шаблона., подразумевая, что, вероятно, никто не смог привести убедительный пример, иллюстрирующий, где это было бы полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...