Термин "объявление функции" определен в §7/9 (N4140), но не определяется как порождение грамматики. Почему?

В §7/9 вы найдете определение объявления функции:

Если decl-specifier-seq не содержит спецификатора typedef, объявление называется объявлением функции, если тип, связанный с именем, является типом функции (8.3.5) и объявление объекта в противном случае.

В §7/1 вы можете найти определение декларации производства грамматики, но там не указано объявление функции как часть этого определения. Другими словами, как можно классифицировать function declaration в грамматике C++?


person Leon    schedule 05.04.2015    source источник
comment
Я бы сказал, что это подкатегория declaration . Это не синтаксическая категория, так как объявление функции фразы обычно используется без курсива, в отличие от 1.6p1, который предполагает, что определение необходимо для пояснительных целей, чтобы выразить ограничения, которые не могут быть или не могут быть удобно выражены как часть CFG.   -  person rici    schedule 05.04.2015
comment
Важной частью (большинства? всех?) языков программирования является то, что грамматика не определяет язык. Вещи, которые не соответствуют грамматике, отсутствуют в языке (как правило, могут быть исключения), но стандарт накладывает больше ограничений на действительные программы, чем грамматика, и может даже определять термины, которые не отображаются как термины в языке. грамматика.   -  person Yakk - Adam Nevraumont    schedule 06.04.2015


Ответы (1)


Поскольку в этом абзаце говорится об объявлениях-объявлений, я полагаю, что он применяется к простому-объявлению, в котором есть список-объявлений-объявлений. . Вы видите, что это не совсем правильно

// clearly, this is not the declaration of an object, so it should
// not be called an "object declaration", but 7p9 does say so
int &a = x;

struct A {
   // AFAICS 7p9 should also apply here, but there is no init-declarator
   // here, but a member-declarator. 9.2 also doesn't delegate to 7p9.
   typedef int a;
};

Следствием этого является то, что следующее также содержит объявление функции, но это объявление не объявляет функцию.

template<typename T> void f();

Подводя итог, я думаю, что в спецификации есть некоторые разъяснения по этому тексту.

person Johannes Schaub - litb    schedule 15.04.2015
comment
Теперь я ясно понимаю, что function declaration это simple-declaration. Спасибо. - person Leon; 02.05.2016