Да, C ++ грамматика странная.По сути, когда дело доходит до объявлений (и только объявлений), у нас есть такая вещь, где:
T D1, D2, ... ,Dn;
означает ( [dcl.dcl] / 3 ):
T D1;
T D2;
...
T Dn;
Это будет знакомо в обычных случаях:
int a, b; // declares two ints
И, вероятно, в случаях, о которых вам было сказано беспокоиться:
int* a, b, *c; // a and c are pointers to int, b is just an int
Но деклараторы могут вводить и другие вещи:
int *a, b[10], (*c)[10], d(int);
Здесь a
- указатель на int, b
- массив из 10 int
с, c
- указатель на массив10 int
с, и d
- функция, принимающая int
, возвращающую int
.
Однако, это только относится к объявлениям.Итак, это:
string r, longestDigitsPrefix(string s);
является допустимым объявлением C ++, которое объявляет r
как string
и longestDigitsPrefix
как функцию, принимающую string
и возвращающую string
.
Но это:
string r, longestDigitsPrefix(string s) { return s; }
- недопустимый C ++.Определения функций имеют собственную грамматику и не могут отображаться как часть init-Declarator-list .
Определение этой функции также неверно, поскольку она использует глобальную переменную для отслеживания состояния.Таким образом, даже если бы оно было действительным, longestDigitsPrefix("12c")
вернуло бы "12"
в первый раз, но "1212"
во второй раз ...