Передача аргументов массива по ссылке
Я столкнулся с функцией с этой сигнатурой.
void foo(char (&x)[5])
{
}
Это синтаксис для передачи массива с фиксированным размером char по ссылке.
Тот факт, что он требует скобок вокруг &x
, кажется мне необычным.
Вероятно, это часть стандарта С++ 03.
Что называется этой формой, и может ли кто-нибудь указать ссылку на стандарт?
С++ decl еще не является другом:
$ c++decl
Type `help' or `?' for help
c++decl> explain void foo(char (&x)[5])
syntax error
Ответы
Ответ 1
В синтаксисе нет ничего необычного или нового. Вы видите это все время на C с указателями. []
имеет более высокий приоритет, чем &
, поэтому вам нужно поместить его в круглые скобки, если вы хотите объявить ссылку на массив. То же самое происходит с *
(который имеет тот же приоритет, что и &
): например, чтобы объявить указатель на массив из 5 символов в C, вы сделали бы char (*x)[5];
. Точно так же указатель на функцию, которая принимает и возвращает int, будет int (*x)(int);
(()
имеет тот же приоритет, что и []
). История одинакова со ссылками, за исключением того, что ссылки относятся только к С++ и существуют некоторые ограничения на то, какие типы могут быть сформированы из ссылок.
Ответ 2
Нечего объяснять, это просто то, как правила синтаксического анализа для объявлений работают на С++:
char & x[5] // declare x as array 5 of reference to char (not valid C++!)
char (&x)[5] // declare x as reference to array 5 of char
Предостережение: Первая версия недействительна С++, хотя вы не можете иметь массивы ссылок. Это просто объяснение синтаксиса объявления. (Извините, что так долго, чтобы получить это право, и благодаря полезным комментариям!)
Вам разрешено обертывать идентификатор типа на уровне арбитражных скобок, если хотите, так что вы также можете сказать char &(x)[5]
(первый случай) или char (((&x)))[5]
(второй случай).
Ответ 3
c++decl
в основном работает для этого. Это просто немного придирчиво к тому, что вы ему даете.
c++decl> explain void foo(char (&)[5])
declare foo as function (reference to array 5 of char) returning void
c++decl> explain void foo(char &[5])
declare foo as function (array 5 of reference to char) returning void
Как отмечено в другом ответе, массив ссылок является незаконным. Компилятор GNU С++ сообщает:
error: объявление 'x как массив ссылок
Кстати, здесь является ссылкой на онлайн-утилиту, которая обслуживает cdecl
(хотя она жалуется на ссылки, потому что версия, размещенная сайт C-specific).