Передача аргументов массива по ссылке - PullRequest
14 голосов
/ 26 октября 2011

Я наткнулся на функцию с этой подписью.

void foo(char (&x)[5])
{
}

Это синтаксис для передачи массива char фиксированного размера по ссылке.

Тот факт, что он требует скобок вокруг &x, кажется мне необычным.

Вероятно, это часть стандарта C ++ 03.

Как называется эта форма, и может ли кто-нибудь указать на ссылку на стандарт?

c ++ decl еще не друг:

$ c++decl 
Type `help' or `?' for help
c++decl> explain void foo(char (&x)[5])
syntax error

Ответы [ 3 ]

11 голосов
/ 27 октября 2011

В синтаксисе нет ничего необычного или нового.Вы видите это все время в Си с указателями.[] имеет более высокий приоритет, чем &, поэтому вам нужно поместить его в скобки, если вы хотите объявить ссылку на массив.То же самое происходит с * (который имеет тот же приоритет, что и &): например, чтобы объявить указатель на массив из 5 символов в C, вы должны сделать char (*x)[5];.Аналогично, указатель на функцию, которая принимает и возвращает int, будет int (*x)(int); (() имеет тот же приоритет, что и []).То же самое относится и к ссылкам, за исключением того, что ссылки существуют только на C ++, и существуют некоторые ограничения на то, какие типы могут быть сформированы из ссылок.

11 голосов
/ 26 октября 2011

Ничего не нужно объяснять, это просто, как правила синтаксического анализа для объявлений работают в C ++:

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

Внимание: Первая версия недопустима в C ++, поскольку выне может иметь массив ссылок.Это просто объяснение синтаксиса объявления.(Извините, что потратил так много времени, чтобы получить это право, и благодаря полезным комментариям!)

Вы можете заключать идентификатор типа в произвольные уровни скобок, если хотите, так что вы также можете сказать char &(x)[5] (первый случай) или char (((&x)))[5] (второй случай).

0 голосов
/ 22 марта 2016

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 C ++ сообщает:

ошибка: объявление 'x' массивом ссылок

Кстати, здесь - это ссылка наонлайн-утилита, которая обслуживает cdecl (хотя она жалуется на ссылки, потому что версия, размещенная на сайте, зависит от C).

...