Этот синтаксис происходит из C-способа чтения переменных.
Когда-нибудь задумывались, зачем нам звездочка, для каждого указателя, который мы хотим объявить в одном выражении?
int *p1, *p2, p3; // p3 is not a pointer
Люди на C ++ обычно склонны видеть переменную определенного типа, которая может быть указателем (другими словами, они видят характеристики указателя как свойство типа ). Вот почему они обычно предпочитают писать
int* p1; // notice asterisk grouped with type
C, а люди читают как: у меня есть переменная p1
, и если я разыменую ее, я получаю тип int
(поэтому p1
, будучи указателем, выводит информацию, то есть они видят характеристики указателя скорее как свойство переменной , и поэтому они скорее группируют звездочку по имени: int *p1;
).
Очень похоже на указатели на функции:
int (*fp) (int, int);
У меня есть переменная fp
, и если я разыменую ее, я получу int (int, int)
. То же самое, что и для typedef
. С другой стороны, (новый) способ определения псевдонима в C ++ намного лучше отражает мышление C ++:
using fp = int (*)(int, int);
У меня есть переменная, и ее тип является указателем (на что угодно) прямо изначало - ну, не совсем последовательно, хотя: при мышлении C ++ указатели на функции могут скорее выглядеть как int(int, int)*
или, возможно, требовать скобки (int(int, int))*
, но ОК, это не так (желание оставаться совместимым с Cявляясь поводом для этого).