Кажется, что это компилируется и даже работает, как ожидалось, в MSVC. Но является ли это законным кодом C ++ и гарантированно ли он будет делать то, что здесь ожидается (то есть экспортировать тип шаблона пользователям структуры под тем же именем)?
template <typename EnumType>
struct Enum
{
// There are two hard problems in CS: cache invalidation and naming things.
typedef EnumType EnumType;
};
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.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .
typedef
(кажется ...) определяет тип как «сам». Итак, я бы отклонил фиксацию на том основании, что «вы отправили своих преемников в погоню за гусиной, чтобы выяснить, что ваш код означает» , без адекватного коммерческого обоснования этого.typedef
. Верно? .. Я понимаю вашу точку зрения и скажу, что для этого нужны комментарии.error: declaration of 'typedef EnumType Enum<EnumType>::EnumType' shadows template parm 'class EnumType'
дляgcc
иclang
, но код компилируется и работает так, как "ожидалось" практически для каждой версии Visual Studio .. Я бы сказал, что VS ошибается в этом сценарий однако