Вы слишком упрощаете структуру объявления C ++ (даже несмотря на то, что высказанные вами слова совершенно логичны). Только на первый взгляд может показаться, что объявление C ++ состоит из имени типа и последовательности имен сущностей, разделенных запятыми, но в действительности в C ++ (как и в C) объявление фактически состоит из имени типа и последовательности объявлений . Полная информация о типе сущности, которую вы объявляете, разделена между двумя отдельными местоположениями, и ее часть фактически является частью ее декларатора. Это так же, как в C ++. Чтобы лучше отразить фактическую структуру объявления (как видно из языка), было бы неплохо отформатировать объявления как
int *a, *b;
т.е. явно сгруппируйте *
s с именами сущностей, а не с именем типа. (Но, в конце концов, это вопрос личных предпочтений.)
Что касается того, почему он разработан таким образом на языке, как вы спрашиваете в одном из комментариев ... Как вы знаете, части синтаксиса объявления, которые описывают тип объявленной сущности, могут появиться на в левой части имени (например, *
и &
), а также в правой части (например, ()
и []
), как в
int *f(), (&g)[5], h[2][2];
Для битов, которые появляются справа, просто невозможно сделать это любым другим способом. У них нет выбора, кроме как быть сгруппированными по имени сущности, а не по имени типа. Кто-то может спросить, почему вышеупомянутые объявления не делаются в C ++, как
int *() f;
int (&)[5] g;
int [2][2] h;
(т. Е. Все, что связано с типами, появляется в левой части компактной группы) ... Ну, ответ на этот вопрос заключается только в том, как это происходит в C ++. Подход унаследован от C, и там «декларация должна напоминать использование» часто цитируется как обоснование.
P.S. Еще одна вещь, которую следует помнить (и что часто интерпретируется неправильно), заключается в том, что квалификаторы, смежные с именем типа в объявлении, являются частью общего типа , а не частью первого отдельного декларатора. Например
int const *a, *b;
объявляет const int *a
и const int *b
, а не int *b
, как некоторые могут ошибочно полагать. По этой причине я лично предпочитаю использовать более логичный
const int *a, *b;
порядок (хотя в то же время я предпочитаю группировать *
с именем, а не с типом).