Forum: PC-Programmierung Was passiert bei direct-brace-initialisierter temporärer typedef'd reference?


von Deckeltyp (Gast)


Lesenswert?

Hallihallo,

Der Titel sagt eigentlich schon alles, aber hier nochmal: Was passiert 
bei direct-brace-initialisierung einer temporären typedef'd reference?
1
S fkt(const S & u){
2
  typedef const S & SR;
3
  //return SR(u); // #1 was passiert hier?
4
  return SR{u}; // #2 und was passiert hier?
5
}
6
7
int main(){
8
  return fkt(S{10}); // S ist "leere" Test-Klasse
9
}

Ich bin beim Herumtesten über diese Funktion gestolpert und versuche 
seitdem herauszufinden, wo der Unterschied zwischen #1 und #2 liegt. Ich 
habe schon versucht, aus cppreference schlau zu werden, bin aber 
gescheitert.
Hat jemand eine Ahnung, was dort passiert, oder kann mir cppreference 
entschlüsseln..?!

MfG
Deckeltyp

von Rosetten-Lippling (Gast)


Lesenswert?

Das kann ich Dir zwar auch nicht sagen, aber mir gefällt dieser Ausdruck 
ungemein:

>>direct-brace-initialisierter temporärer typedef'd reference?

Herr Doktor, was habe ich? Sagen Sie mir die Wahrheit!

Nun, mein Guter -es ist eine sog.
>>direct-brace-initialisierter temporärer typedef'd reference?

Mein Gott -das ist ja furchtbar!

von Da Baby [reformed] (Gast)


Lesenswert?

Ich würde sagen:

Beim 1. Wird der copy constructor aufgerufen
Beim 2. Auch?

Mach mal ein std::cout rein in den copy-constructor dann siehst man es 
vllt^^

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Deckeltyp schrieb:
> temporären typedef'd reference

Also wenn schon ist das lokal, aber nicht temporär. Ob lokal oder nicht 
spielt aber keine Rolle.

Deckeltyp schrieb:
> Ich bin beim Herumtesten über diese Funktion gestolpert und versuche
> seitdem herauszufinden, wo der Unterschied zwischen #1 und #2 liegt.

Ich denke nicht dass es einen gibt.

Die Bastelei mit dem typedef ist komplett unnötig. Der "u" Parameter 
ist ja schon eine const reference. Ziemlich sinnlos da nochmal eine 
neue Reference draus zu machen.

Die Funktion erstellt jedenfalls eine Kopie des übegebenen Objekts. Der 
Rückgabetyp ist ja nur "S" (keine Referenz!), dementsprechend wird eine 
"S" Instanz erstellt und "u" als Parameter an den Konstruktor übergeben. 
Das sollte den copy constructor aufrufen.

Man hätte auch einfach "return { u };" schreiben können.

: Bearbeitet durch User
von Deckeltyp (Gast)


Lesenswert?

Ok Danke. Etwas genau so zu bezeichnen, wie es im Standard genannt wird, 
ist bei c++ gar nicht so leicht..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.