Может ли явная специализация шаблона класса также объявить что-то еще ?

Было бы неплохо, если бы этот код был недействительным. Но он концептуально верен, и GCC принимает его , хотя Комо не принимает:

template< typename > struct t;

template<> struct t< int > {} r; // Bad declarator! Don't pee on the carpet!

( Изменить: выше компилируется но r , похоже, не объявляется в какой-либо области , поэтому он по существу игнорируется.)

Явные специализации заполняют своего рода нижнюю область между шаблонами и классами. Тип, объявленный объяснение Специализация cit считается завершенной после ее определения. С точки зрения компилятора, это не шаблон. Если бы это был параметризованный шаблон, объявить объект было бы невозможно. Рассмотрим §14 / 3:

В объявлении шаблона, явной специализации или явной реализации список-деклараторов-инициаторов в описании должен содержать не более одного декларатора. Когда такое объявление используется для объявления шаблона класса, использование декларатора не допускается.

Что означает «используется для объявления шаблона класса»? Очевидно, что первичный шаблон объявляет шаблон класса. И частичная специализация тоже, согласно §14.5.5 / 1 (номера FDIS):

Объявление шаблона, в котором имя шаблона класса является идентификатором простого-шаблона, является частичной специализацией шаблона класса, названного в simple-template-id.

Когда дело доходит до явных специализаций, Стандарт говорит в терминах объявления, которому предшествует последовательность лексем template . Он выглядит как шаблон и называет имя шаблона, но, похоже, он не объявляет шаблон.

Действительно странно, что §14 / 3 ограничивает количество деклараторов до " максимум один. " Объявление шаблона функции, явная специализация или создание экземпляра должны иметь только один декларатор. Любое объявление, включающее шаблон класса, должно иметь ровно ноль… кроме явной специализации, которая, кажется, не выдерживает критики. Честно говоря, GCC отказывается разрешить

template<> struct t< int > {} r, s; // Offer valid one per specialization.

Я склонен согласиться с интерпретацией GCC, какой бы абсурдной она ни была. К сожалению, это может препятствовать его способности обнаруживать пропущенные точки с запятой. Пожалуйста, позвольте количеству разрешенных деклараторов быть ровно нулем!

11
задан Potatoswatter 20 June 2011 в 19:08
поделиться