const Referenzparameter

73

Gibt es einen Unterschied zwischen den folgenden Erklärungen?

void somefunc(const Person &p);
void somefunc(Person const &p);
BartoszKP
quelle
8
Sie sollten beachten, dass der Verweis für die Frage irrelevant ist: "const Person p" entspricht ebenfalls "Person const p".
Evan Teran

Antworten:

91

Es gibt keinen Unterschied . constbindet an den Typ links davon ... es sei denn, es ist der erste Teil der Deklaration. In diesem Fall bindet es rechts.

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

Persönlich finde ich, dass const T &xdas besser liest. Nach diesem , Bjarne zieht auch die setzte consterst. Insbesondere, weil das Schlüsselwort ursprünglich aufgerufen werden sollte readonlyund readonly int xbesser lautet :-P.

Evan Teran
quelle
1
Obwohl ich sagen würde, dass der erste häufiger ist.
Rlbond
@rlbond: Häufiger hängt von einem Kontext ab. An bestimmten Stellen sehe ich das erste häufiger, an anderen sehe ich das zweite häufiger. Es hängt alles davon ab.
Martin York
6
sicherlich ist die zweite konsistenter, wenn es um Indirektion geht. zum Beispiel: int const * const x; (alles bindet links)
Evan Teran
Frage zu Ihrer Aussage "const bindet an den Typ links ... bindet rechts". Ist diese Links / Rechts-Bindungsregel ein formales Konzept, das vom C ++ - Standard beschrieben wird? Ich versuche, den C ++ - Standard zu verstehen, der etwas schwer zu lesen ist und nichts findet, was ein solches Konzept beschreibt. (Ich suche nur nach Hilfe, während ich versuche, den C ++ - Standard zu verstehen)
JavaMan
@ JavaMan: Leider ist es nicht ganz so einfach wie ein Absatz, der dies sagt. Im hinteren Teil des Standards befindet sich eine "Grammatikzusammenfassung". Welches spezifiziert die Sprache auf einer Grammatikebene. Dazu gehört die Angabe, in welchen Kontexten CV-Qualifizierer gültig sind.
Evan Teran
47

Ja da ist! der erste ist besser lesbar :)

AraK
quelle
Ich denke, Sie möchten sagen "besser lesbar für diejenigen, die LTR lesen!" :) Ich hörte einige Leute im Osten ihren Text RTL lesen.
Johannes Schaub - litb
2
Nein! Der Zweite! (Wirklich - Sie müssen Definitionen von rechts nach links lesen: Person const * volatile * p; // p ist ein flüchtiger Pinter für einen Cont-Zeiger auf eine Person.)
MSalters
1
@litb :: Ich habe eine dieser RTL-Sprachen gelesen und es ist nicht schwer, weil es meine Muttersprache ist: D
AraK
11

Siehe diese http://www.parashift.com/c++-faq-lite/const-correctness.html

(Siehe stattdessen neuen Link: https://isocpp.org/wiki/faq/const-correctness#const-ref-alt )

Insbesondere 18,6 bis 18,8.

[18.6] Was bedeutet "const Fred & x"?

Dies bedeutet, dass x ein Fred-Objekt aliasisiert, aber x kann nicht zum Ändern dieses Fred-Objekts verwendet werden.

[18.7] Ist "Fred & const x" sinnvoll?

Nein, das ist Unsinn.

[18.8] Was bedeutet "Fred const & x"?

Fred const & x ist funktional äquivalent zu const Fred & x. Die eigentliche Frage ist jedoch, welche verwendet werden sollte.

Lesen Sie den Rest des Artikels für weitere Informationen. Aber im Wesentlichen heißt es, dass sie gleichwertig sind, und Sie können beide verwenden, wie Sie es für richtig halten. Sie sollten jedoch eine auswählen und dabei bleiben, um zukünftige Verwirrung zu vermeiden.

abelenky
quelle
4
Ich werde hinzufügen, einen auswählen und beim Schreiben von neuem Code dabei bleiben, aber wenn Sie vorhandenen Code ändern, bleiben Sie bei der Art und Weise, wie der vorhandene Code dies tut.
Rob K
4

Es ist wirklich Geschmackssache.

Wenn von rechts nach links gelesen, " Person const & x" liest "x ist eine Referenz auf eine konstante Person."

Dies klingt besser als " const Person & x", was "x ist eine Referenz auf eine Person, die konstant ist" wäre.

Wenn man also mit der Leserichtung von Variablendeklarationen von rechts nach links vertraut ist, würde man vielleicht die erste bevorzugen.


quelle
4

Beide sind gleich.

const Person & x ist derzeit am beliebtesten, da Englisch Adjektive vor die Substantive setzt, und das macht es "englischer".

Die alternative Form Person const & x wurde als weniger idiomatische Form vorgeschlagen. Ihr Argument war, dass diese Form immer von rechts nach links analysiert werden kann: "x ist ein Verweis auf eine konstante Person." Das Argument war, dass die Klarheit der Analyse wichtiger sei als die idiomatische Struktur.

Unglücklicherweise für diese Leute behandelt ihre Form nicht alles. Sobald Sie Arrays, Funktionszeiger und andere exotische Formen sehen, brechen die Regeln zusammen. char * str [10] kann nicht von rechts nach links geschrieben werden, da sich das Array auf der rechten Seite befinden muss. void (* signal (int, void (* fp) (int))) (int) lässt die Menschen von rechts nach links vor Schmerzen zusammenzucken.

Nur die Regel ist jemals aufgetaucht, um für alle Typen einen Sinn zu ergeben, die Clockwise Spiral-Regel: http://c-faq.com/decl/spiral.anderson.html

Sobald jemand die Spirale im Uhrzeigersinn sieht, gehen normalerweise alle Hoffnungen auf eine klare Parsing-Regel aus dem Fenster. Die meisten Leute akzeptieren dann, dass const Person & x wahrscheinlich der beste Weg ist!

Cort Ammon
quelle