2009-06-23 11 views
72

Czy istnieje różnica między następującymi deklaracjami?Parametry odniesienia const

void somefunc(const Person &p); 
void somefunc(Person const &p); 
+8

Należy zauważyć, że odniesienie nie ma związku z pytaniem: "const Person p" jest równoznaczne z "Person const p". –

Odpowiedz

91

jest żadnej różnicy. const łączy się z typem po lewej stronie ... chyba że jest to pierwsza część deklaracji, w którym to przypadku wiąże się ona z prawą.

Patrz: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt

Osobiście uważam, że const T &x brzmi lepiej. Według this, Bjarne również preferuje najpierw wstawić const. W szczególności dlatego, że słowo kluczowe pierwotnie miało być nazywane readonly i readonly int x brzmi lepiej :-P.

+1

Chociaż powiedziałbym, że pierwszy jest bardziej powszechny. – rlbond

+0

@rlbond: Częściej zależy od kontekstu. W niektórych miejscach widzę pierwsze częściej spotykane w innych, drugie jest bardziej powszechne. Wszystko dependuje. –

+6

z pewnością drugi jest bardziej * konsekwentny * w przypadku pośrednictwa. na przykład: int const * const x; (wszystko wiąże się po lewej) –

11

Zobacz ten http://www.parashift.com/c++-faq-lite/const-correctness.html

(Zobacz nowy link Zamiast: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt)

Konkretnie 18,6 do 18,8.

[18.6] Co oznacza "const Fred & x"?

Oznacza to x aliases obiektu Fred, ale x nie może być użyty do zmiany tego obiektu Fred.

[18.7] Czy "Fred & const x" ma jakiś sens?

Nie, to nonsens.

[18.8] Co oznacza "Fred const & x"?

Fred const & x jest funkcjonalnie jest równoznaczny z const Fred & x. Jednak prawdziwe pytanie brzmi: , który powinien być użyty jako .

Przeczytaj resztę artykułu, aby uzyskać więcej informacji. Ale w gruncie rzeczy mówi, że są one równoważne i możesz użyć jednego z nich, jak ci się podoba. Jednak powinieneś wybrać jeden i trzymać się go, aby uniknąć przyszłego zamieszania.

+4

Dodam, wybiorę i trzymam się go przy pisaniu nowego kodu, ale modyfikując istniejący kod, trzymaj się go w taki sposób, jak robi to dotychczasowy kod. –

47

Tak, jest! pierwszy jest bardziej czytelny :)

+0

Chyba chcesz powiedzieć "bardziej czytelny dla tych, którzy czytają LTR!" :) Słyszałem, że niektórzy ludzie na wschodzie czytali tekst RTL. –

+2

Nie! Drugi! (Naprawdę - musisz czytać definicje od prawej do lewej: Osoba const * volatile * p; // p jest zmienną pinter na wskaźnik do osoby). – MSalters

+1

@litb :: Przeczytałem jeden z tych języków RTL i nie jest to trudne, ponieważ jest to mój język ojczysty: D – AraK

4

To naprawdę jest kwestia gustu.

Jeśli czyta się od prawej do lewej, "Person const & x" oznacza "x jest odniesieniem do stałej Osoby."

To brzmi lepiej niż "const Person & x", co oznaczałoby "x jest odniesieniem do osoby, która jest stała."

Więc jeśli ktoś zna kierunek odczytywania zmiennych od prawej do lewej, to być może wolałby pierwszy.

4

Obie są takie same.

const Osoba & x jest obecnie najbardziej popularna, ponieważ angielski umieszcza przymiotniki przed rzeczownikami, co sprawia, że ​​jest "bardziej po angielsku".

Alternatywny formularz, Osoba const & x, został zaproponowany jako forma mniej idiomatyczna. Ich argumentem było, że ta forma zawsze może być przetwarzana od prawej do lewej, "x jest odniesieniem do Osoby stałej". Argumentowano, że przejrzystość analizy jest ważniejsza niż struktura idiomatyczna.

Niestety dla tych osób ich forma nie radzi sobie ze wszystkim. Gdy zaczniesz widzieć tablice i wskaźniki funkcji oraz inne egzotyczne formy, zasady zaczną się rozkładać. char * str [10] nie może być zapisany od prawej do lewej, ponieważ tablica musi znajdować się po prawej stronie. void (* signal (int, void (* fp) (int))) (int) sprawia, że ​​prawo do lewej osoby boleje z bólu.

Tylko zasada nigdy nie pojawił się do sensu wszystkich typów, z reguły zgodnie z ruchem wskazówek Spiral: http://c-faq.com/decl/spiral.anderson.html

Zazwyczaj, gdy ktoś widzi spiralę w prawo, wszelkie nadzieje na ogół wyraźna analizowania wychodzi przez okno. Większość ludzi akceptuje to, że osoba & x jest prawdopodobnie najlepszym rozwiązaniem!

Powiązane problemy