Идентификатор объявления - это синтаксический элемент, который задает имя в простом объявлении («имя типа;»). В следующих «A» и «B :: C» - идентификатор объявления
int A;
int B::C;
int A();
int *A;
int A[42];
template<typename T> void A();
Синтаксически идентификатор типа представляет собой простое объявление, в котором идентификатор объявления отсутствует. Идентификатор типа используется в качестве синтаксического элемента в аргументе типа шаблона и в приведении.
int // type-id
int* // type-id
int[] // type-id
int() // type-id
int(*)() // type-id
Имя шаблона - это имя шаблона. Синтаксически он появляется перед списком аргументов шаблона. Вышеприведенная цитата неправильно использует «имя шаблона» и «идентификатор объявления», потому что имя шаблона является простым идентификатором и не содержит никаких квалификаторов. C ++ 0x изменил текст на
В объявлении шаблона функции последний компонент идентификатора объявления должен быть именем шаблона или идентификатором оператора-функции (т. Е. Не идентификатором шаблона).
(последняя часть появляется в таких случаях, как operator+()
). Даже текст C ++ 0x пропускает некоторые случаи - см. этот отчет о дефектах .
Неправильное использование «объявления-идентификатора» происходит в примечании. Заметка была заменена на C ++ 0x с
[Примечание: в объявлении шаблона класса, если имя класса ... - конец примечания]
В объявлениях шаблонов классов указанное синтаксически имя является именем класса вместо идентификатора объявления. Соотношение имени класса и объявления объявления выглядит следующим образом (очень упрощенно ...)
class class-name { ... } declarator-id;
class foo { ... } bar;
В объявлениях шаблонов классов может быть не указан идентификатор объявления.
Идентификатор шаблона - это имя шаблона, за которым следует список аргументов шаблона.
Кавычка означает, что в объявлении функции template имя не должно быть идентификатором шаблона. В вашем примере вы объявляете функцию вместо шаблона. Однако все еще есть случаи, когда явная специализация объявляет шаблон. Но это может произойти только для шаблонов функций-членов
template<typename T>
struct A {
template<typename U>
void f();
};
// this explicit specialization *contains* a template declaration and
// declares an identifier (a template-name) qualified by A<int>::
template<> template<typename U>
void A<int>::f() { }