Подтвердить что ты не робот

Передача аргументов массива по ссылке

Я столкнулся с функцией с этой сигнатурой.

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
4b9b3361

Ответ 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).