Was benutzen bei der Übergabe?
-
Hi ihr!
Wollte mal so fragen was man bei einer Funktion für eine Übergabevariante bevorzugen sollte, bzw. wo der unterschied ist?
void foobar (const std::string& wert) ...oder
void foobar (const std::string const& wert) ...oder
void foobar (std::string const& wert) ...
-
lezten
-
Erste und dritte Variante sind äquivalent, ich persönlich bevorzuge Nummer 3. Denn
constbezieht sich immer auf das was links davon steht (also dasstd::string), es sei denn, es steht selbst ganz links, wie in Variante 1. So gesehen ist Variante 3 also einheitlicher, insbesondere wenn man irgendwann Typen benutzt, wo mehrmalsconstvorkommt.Deine 2. Variante ist allerdings einfach nur doppelt-gemoppelt, ohne daß sich dadurch irgendetwas ändern würde.
-
Die 1.
Edit: Visual Studio erlaubt const-references!

-
David_pb schrieb:
Edit: Visual Studio erlaubt const-references!

Wenn du damit meinst, daß man sowas schreiben kann wie "
Foo & const", das erlaubt meines Wissens auch der C++-Standard. Es ist nur vollkommen sinnfrei, schließlich sind Referenzen ohnehin konstant.
-
dooooomi schrieb:
David_pb schrieb:
Edit: Visual Studio erlaubt const-references!

Wenn du damit meinst, daß man sowas schreiben kann wie "
Foo & const", das erlaubt meines Wissens auch der C++-Standard. Es ist nur vollkommen sinnfrei, schließlich sind Referenzen ohnehin konstant.Der Standard erlaubt das nur bei Typendefinitionen, oder bei Template-Type Argumenten (im dem Fall wird ein cv-qualifier einfach ignoriert).
Aber ja, genau das meint ich!
-
Ich nehm eigentlich auch die erste, die finde ich schöner.

Man muss halt nur schauen, wenn man beispielsweise sowas hat:
const int* const ptr = 0;Also welches
constsich auf den Zeiger (2.) und welches auf den Wert hinter dem Zeiger (1.) bezieht.Das Spielchen kann man auch weitertreiben...

const int * const * const ptr = 0;
-
Nexus schrieb:
Das Spielchen kann man auch weitertreiben...

const int * const * const ptr = 0;Wobei hier ja keine nennenswerten Änderungen mehr spürbar werden!

-
Nexus schrieb:
Man muss halt nur schauen, wenn man beispielsweise sowas hat:
const int* const ptr = 0;Also welches
constsich auf den Zeiger (2.) und welches auf den Wert hinter dem Zeiger (1.) bezieht.Der Trick besteht darin
int const * const ptr = 0;zu schreiben.
Dann ist es naemlich logisch korrekt (von rechts nach links gelesen)
ptr (ist ein) konstanter zeiger (auf einen) konstanten integer
-
Stimmt, das wäre intuitiver.
Ich hab es wohl so gemacht, da ich eher
const intalsint constschreibe und das einfach mal so ergänzt habe.