Кажется, что это компилируется и даже работает, как ожидалось, в MSVC. Но является ли это законным кодом C ++ и гарантированно ли он будет делать то, что здесь ожидается (то есть экспортировать тип шаблона пользователям структуры под тем же именем)?

template <typename EnumType>
struct Enum
{
   // There are two hard problems in CS: cache invalidation and naming things.
   typedef EnumType EnumType;
};
4
Violet Giraffe 28 Июн 2016 в 00:08
4
Возможно, но как рецензент кода или менеджер я бы отклонил это, потому что (по крайней мере для меня) не сразу то, что говорит эта конструкция, и почему это должно быть необходимо. «На первый взгляд бессмысленно», когда typedef (кажется ...) определяет тип как «сам». Итак, я бы отклонил фиксацию на том основании, что «вы отправили своих преемников в погоню за гусиной, чтобы выяснить, что ваш код означает» , без адекватного коммерческого обоснования этого.
 – 
Mike Robinson
28 Июн 2016 в 00:13
1
... (очевидно, что мой комментарий как прочитанный звучит немного более "резким" и "драконовским", чем я на самом деле предполагал.) :-) Я действительно я довольно приятный человек. . .
 – 
Mike Robinson
28 Июн 2016 в 00:14
@MikeRobinson: о, я уверен, что вы хороший человек и никого бы не уволили за один typedef. Верно? .. Я понимаю вашу точку зрения и скажу, что для этого нужны комментарии.
 – 
Violet Giraffe
28 Июн 2016 в 00:16
Выстрелили? Хех ... "Пусть тот, кто среди вас непорочен, бросит первый камень". (Пока я ставлю копию фильма в очередь, Лжец, Лжец!) :-D Как однажды сказал мой бывший наставник : "Не переживайте. Это только нули и единицы"
 – 
Mike Robinson
28 Июн 2016 в 00:39
Примечание: error: declaration of 'typedef EnumType Enum<EnumType>::EnumType' shadows template parm 'class EnumType' для gcc и clang, но код компилируется и работает так, как "ожидалось" практически для каждой версии Visual Studio .. Я бы сказал, что VS ошибается в этом сценарий однако
 – 
txtechhelp
28 Июн 2016 в 02:09

1 ответ

Лучший ответ

Я думаю, что определение типа недопустимо.

14.6.1 Локально объявленные имена (N4296)

6 Параметр-шаблон не должен повторно объявляться в пределах его области действия (включая вложенные области). Параметр-шаблон не должен иметь то же имя, что и имя шаблона. [ Пример:

 
template<class T, int i> class Y { 
   int T;  // error: template-parameter redeclared 
   void f() { 
       char T; // error: template-parameter redeclared 
   }
}; 

template<class X> class X;  // error: template-parameter redeclared

- конец примера]

typedef EnumType EnumType - это переопределение параметра шаблона как typedef-name.

2
txtechhelp 28 Июн 2016 в 01:55