2011-10-26 15 views
13

Natknąłem się na funkcję z tą sygnaturą.Przesyłanie argumentów tablicowych przez odniesienie

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

Jest to składnia służąca do przekazywania tablicy o stałym rozmiarze przez odwołanie.

Fakt, że wymaga nawiasów wokół &x, wydaje mi się niezwykły.

Jest to prawdopodobnie część standardu C++ 03.

Co to jest ten formularz i czy ktoś może wskazać odniesienie do normy?

C++ decl nie jest przyjacielem jeszcze:

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

Nie mogę wskazać standardu, ale uważam, że dzieje się tak, ponieważ 'char & x [5]' jest tablicą 5-znakowych odniesień, a nie odwołaniem do tablicy znaków o długości 5. –

+0

'C++ decl' jest twoim przyjacielem :-) –

+1

8.3.2 Referencje "Nie będzie odwołań do referencji, tablic referencyjnych ani żadnych odnośników do referencji." –

Odpowiedz

11

Nie ma nic niezwykłego ani nowego w składni. Widzisz to cały czas w C ze wskaźnikami. [] ma wyższy priorytet niż &, więc musisz umieścić go w nawiasach, jeśli chcesz zadeklarować odniesienie do tablicy. To samo dzieje się z * (która ma taki sam priorytet jak &): Na przykład, aby zadeklarować wskaźnik do tablicy 5 znaków w C, zrobiłbyś char (*x)[5];. Podobnie wskaźnik do funkcji, która pobiera i zwraca wartość int, będzie int (*x)(int); (() ma taki sam priorytet jak []). Historia jest taka sama jak w przypadku referencji, z tym że referencje są tylko w C++ i istnieją pewne ograniczenia co do tego, jakie typy można tworzyć z referencji.

+0

+1 W celu wyjaśnienia wymagań dotyczących nawiasów. Gdzie są udokumentowane ograniczenia dotyczące tworzenia typów z referencji? –

+0

@Eddy Pronk: Odnosząc się do stwierdzenia, które cytowałeś w swoim komentarzu do twojego pytania powyżej – newacct

11

Nie ma nic do wyjaśnienia, to jest po prostu jak zasady analizowania dotyczące zgłoszeń pracować w 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 

Uwaga: Pierwsza wersja nie jest jednak poprawna C++, ponieważ nie możesz mieć tablic referencyjnych. Jest to jedynie wyjaśnienie składni deklaracji. (Przepraszam za tak długo, aby uzyskać to prawo, a dzięki pomocne komentarze!)

Masz prawo do zawijania identyfikator typu w arbitray poziomów nawiasów, jeśli chcesz, więc można również powiedzieć char &(x)[5] (pierwszy przypadek) lub char (((&x)))[5] (drugi przypadek).

+0

+1: Zgadza się.) –

+0

Który kompilator akceptuje pierwszy formularz? gcc 4.4.5 nie: błąd: deklaracja "x" jako zestawu odniesień –

+0

Z wyjątkiem oczywiście, że pierwsza nie jest legalna w C++, ponieważ nie wolno mieć tablic referencyjnych. –

0

c++decl głównie do tego służy. To tylko trochę wybredne, co dajesz.

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 

Jak zauważono w innej odpowiedzi, tablica odniesień jest nielegalna. GNU C++ kompilator raporty:

error: declaration of ‘x’ as array of references

Nawiasem mówiąc, here jest link do narzędzia online, które służy cdecl (choć narzeka odniesienia, ponieważ wersja hostowane przez strony specyficznych C).

Powiązane problemy