Stilfrage: T& a oder T &a
-
Die Referenz wird by value übergeben. Wie die implementiert ist ist unerheblich.
Von hinten durch die Burst,
und das mit inniger Lust...Sehe ich bei der Verwendung von Referenzen dieses Detail? Das die Referenz-Klasse/Datenobjekt/Zeiger/Apfelkuchen als Call-By-Value übergeben wird?
Nö.
Also kann ich etwas abstrahieren und sagen das ist Call-By-Reference. Sonst würden Referenzen nicht Referenzen heißen.
Und selbst der geneigte Entwickler kann bei Zeigern mit ein wenig Abstraktionsvermögen unter gewissen Umständen Call-By-Reference entdecken.
-
Bitte ein Bit schrieb:
Also kann ich etwas abstrahieren und sagen das ist Call-By-Reference. Sonst würden Referenzen nicht Referenzen heißen.
Und selbst der geneigte Entwickler kann bei Zeigern mit ein wenig Abstraktionsvermögen unter gewissen Umständen Call-By-Reference entdecken.
Kann man tun. Sollte man aber nicht. Denn das ist viel komplizierter als die call by value Sicht und außerdem nicht eindeutig.
"Ich übergebe eine Referenz auf einen String" ist für mich eindeutig. Nur String & ist möglich. Bei dir geht String &, String *, String **, ... als "Referenz" durch.Ich lass das jetzt mal sein, bringt eh nichts.
-
nwp3 schrieb:
Das Rausoptimieren ist doch kein Argument, das passiert bei Pointern und Integern auch.
void myFunc(int& a){ ... myFunc(a);//call by value? }angenommen der Compiler optimiert den Funktionsaufruf nicht raus:wärst du dir sicher, dass hier das "referenzobjekt" im inneren kopiert wird? Oder könnte der Compiler das nicht doch anders smart machen?
-
Ich bin etwas überrascht, wer sich alles an der Diskussion beteiligt.
-
Aber eigentlich hat nwp3 Recht:
Bei call by reference wird eine reference by value übergeben, also ist das eigemtlich call by value.
-
Nathan schrieb:
Aber eigentlich hat nwp3 Recht:
Bei call by reference wird eine reference by value übergeben, also ist das eigemtlich call by value."Aber eigentlich hat nwp3 Unrecht:
Bei call by reference wird ein object by reference übergeben, also ist das eigemtlich call by reference."Echt lustig, die Argumentation hier, nur um krampfhaft der geläufigen Terminologie zu widersprechen

-
Ich sag ja auch, dass call by reference call by reference ist.
Aber:
template <typename T> void func(T t);
Ist eindeutig call by value.
Und
func<int&>(foo);
ist folglich ebenfalls call by value aus Sicht der Funktion, aber call by reference aus Sicht des Aufrufers.
Denn T - also int& - wird ja by value übergeben, aber foo wird by reference übergeben.
-
Nathan schrieb:
template <typename T> void func(T t);
Ist eindeutig call by value.Nein. Was es ist, hängt von T ab.
Mir ist durchaus klar, worauf du hinauswillst. Natürlich kann man die Sichtweise vertreten, die Referenz werde kopiert. Das ändert aber nichts an der Definition (!) von "call-by-reference" als Übergabe einer "Indirektion" auf ein Objekt anstelle des Objekts selbst. Der Begriff stammt ja ursprünglich auch aus Sprachen, wo die Unterscheidung klarer ist als in C++.
Alle Übergaben als "call-by-value" zu bezeichnen, widerspricht nicht nur der Definition und dem weitläufigen Verständnis des Begriffs, sondern macht letzteren komplett überflüssig. Wenn du nicht mehr unterscheidest, haben die Begriffe Null Aussagekraft.

-
Ich schrieb ja selber:
Nathan schrieb:
Ich sag ja auch, dass call by reference call by reference ist.
-
Nathan schrieb:
Ich sag ja auch, dass call by reference call by reference ist.
Schön, dass wir diese Tautologie geklärt haben.

Alle Übergaben als "call-by-value" zu bezeichnen, widerspricht nicht nur der Definition und dem weitläufigen Verständnis des Begriffs, sondern macht letzteren komplett überflüssig. Wenn du nicht mehr unterscheidest, haben die Begriffe Null Aussagekraft.
Danke, so meinte ich das.
-
Aber eigentlich hat nwp3 Recht:
Bei call by reference wird eine reference by value übergeben, also ist das eigemtlich call by value.Und programmiertechnisch hat er Unrecht.
void Test(int& a) {}Ja intern, da wird bei auch bei Call-By-Reference was übergeben. Wir reden davon das die compilertechnische Implementierung des & Operators evt. auch per Call_By-Value übergeben werden könnte!
Aber das juckt mich doch beim Programmieren nicht!
Call-By-Value und Call-By-Reference sind doch ein Hilfsmittel beim erlernen einer Programmiersprache. Call-By-Reference sagt, dass ich ein abstrakten Datentyp (ADT) mittels einer Referenz ansprechen möchte, und nicht in dem ich das komplette Objekt kopiere.
-
Call-By-Reference sagt, dass ich ein abstrakten Datentyp (ADT) mittels einer Referenz ansprechen möchte
Was zum Teufel hat das mit abstrakten Basisklassen zu tun? call-by-reference bezieht sich auf alle Referenzen.
-
Was zum Teufel hat das mit abstrakten Basisklassen zu tun? call-by-reference bezieht sich auf alle Referenzen.
Gute rekursive Frage. Was zum Teufel hat das mit abstrakten Basisklassen zu tun? Oder besser: Was hat abstrakte Datentypen mit abstrakten Basisklassen zu tun?
Definition ADT: Abstrakten Datentypen
