Was passiert bei direct-brace-initialisierter temporärer typedef'd reference?

Gast #7347350

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

Gast #7347370

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!

Gast #7347382

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^^

Persönliche Seite #7347385

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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.