Разница в порядке ключевых слов в объявлении с++
Объясните мне пожалуйста в каком порядке можно ставить ключевые слова в объявлении. Допустим у нас есть объявление inline-функции:
inline int Sum(int a, int b)
{ return a+b; }
Но мы можем поменять местами int и inline:
int inline Sum(int a, int b)
{ return a+b; }
И тогда ничего не поменяется, что лично для меня очень странно ведь функция объявляется, как
имя-типа идентификатор {тело-функции}
А тут идет как будто функция возвращает не int, а inline(очень грубо сказано, но так это выглядит в моём понимании). Так вот, это ещё не всё. Если мы попробуем такую же схему провернуть с шаблоном функции, то у нас уже так не получится и запись по типу:
int template<type T> Sum(T a, T b)
{ return a+b; }
//функция приведена для примера, в реальности такая функция была бы скорее всего бесполезна
Уже не пройдёт. И так же с объявлением переменных, почему-то запись по типу:
int const a;
Спокойно скомпилируется, что вызывает у меня аналогичные вопросы, как и с функцией. Есть ли какие-то специальные правила, для разрешения данного вопроса или что-то подобное? Заранее благодарю за помощь)
Ответы (1 шт):
Ответ такой же, как и в прошлый раз - читайте грамматику. :)
Всякие int, const, inline - это все части т.н. decl-specifier-seq. Внутри него порядок не важен.
Всякие *, &, (...), [...] - не его часть (это части declarator-а, вместе с именем функции/переменной).
template <...> - тоже не его часть. Как вы заметили, он всегда левее decl-specifier-seq.
Например, в const int *a, b;, decl-specifier-seq - это const int, и он относится к обоим переменным. А *a и b - это деклараторы, так что звездочка действует только на свою переменную.