Markus schrieb:
> Wilhelm M. schrieb:
>> Was hat das Thema mit Listen zu tun?
>
> Gar nichts, ich wußte nicht, welcher Titel am besten paßt:
Dann wundere Dich nicht über wenige Beiträge zum eigentlichen Thema ;-)
> Anstatt
1 | A
|
2 | > bar() { return A(); }
|
las ich
und
> wunderte mich über das { return A(); }. Wie nennst du hier die
> geschweiften Klammern?
Der Funktionskörper ist ein Block: die geschweiften Klammen sind die
Block-Begrenzer.
>> Meinst Du wirklich die Unterscheidung ro/rw bei return-Werten?
>
> Darauf läuft es im Buch hinaus, Überladen von const und nicht-const.
Bzgl. des Rückgabetyps kannst Du in C++ nicht überladen: der Typ der
Funktion ist nicht Bestandteil der Signatur, deswegen ist solches
Vorgehen kein korrektes Überladen.
Von Überladen spricht man, wenn die Signatur sich unterscheidet, aber
der Name (Bestandteil der Signatur) gleich bleibt:
oder
1 | struct A {
|
2 | voif f();
|
3 | voif f() const;
|
4 | };
|
> Zuvor muß ich aber lvalues und rvalues verstehen...
Betrachte rvalues als temporäre-anonyme Objekte.
>> Oder meinst Du die ref-Qualifikation von Elementfunktion? Also, ob eine
>> Elementfunktion auf ein rvalue oder lvalue anwendbar ist (ich meine
>> nicht die Parameterliste).
>> Ersteres ist bei primitiven DT sinnlos und bei UDT ggf. schlecht, weil
>> es ein move ggf. verhindert.
>
> Was immer damit gemeint sein mag, ich bin davon noch weit entfernt ;-)
Ok, dann vergiss es fürs erste. Es geht um:
1 | struct A {
|
2 | void f() &;
|
3 | void f() &&;
|
4 | };
|
5 |
|
6 | A foo();
|
Im ersten Fall muss das Objekt, für dass f() aufgerufen wird (bspw:
a.f()) ein lvalue sein, im zweiten Fall ein rvalue (bspw: foo().f() ).