Разница в порядке ключевых слов в объявлении с++

Объясните мне пожалуйста в каком порядке можно ставить ключевые слова в объявлении. Допустим у нас есть объявление 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 шт):

Автор решения: HolyBlackCat

Ответ такой же, как и в прошлый раз - читайте грамматику. :)

Всякие int, const, inline - это все части т.н. decl-specifier-seq. Внутри него порядок не важен.

Всякие *, &, (...), [...] - не его часть (это части declarator-а, вместе с именем функции/переменной).

template <...> - тоже не его часть. Как вы заметили, он всегда левее decl-specifier-seq.

Например, в const int *a, b;, decl-specifier-seq - это const int, и он относится к обоим переменным. А *a и b - это деклараторы, так что звездочка действует только на свою переменную.

→ Ссылка