auto referenz



  • std::array<int, 5> &foo();
    auto arr = foo();
    

    Warum ist arr ein "std::array<int, 5>" und kein "std::array<int, 5> &"?



  • nwp3 schrieb:

    std::array<int, 5> &foo();
    auto arr = foo();
    

    Warum ist arr ein "std::array<int, 5>" und kein "std::array<int, 5> &"?

    Die Referenz bezieht sich auf den return Wert. Und den return Wert kopierst du dann. Ist doch praktisch das Gleiche wie:

    int x; // return x
    int& rx=x; // Der return Wert: Referenz auf x
    int arr = rx; // Den return Wert kopieren
    


  • Mal ein Schritt weitergedacht: auto kann nie ein Referenztyp sein, weil nach dem Bezeichner immer ein = steht.



  • Als Ergänzung:
    Wer auto in range-for nutzt, sollte die referenz nicht vergessen, sonst erzeugt jede Iteration eine Kopie.



  • out schrieb:

    Mal ein Schritt weitergedacht: auto kann nie ein Referenztyp sein, weil nach dem Bezeichner immer ein = steht.

    Irgendwie ist der Satz komisch :D. Was ich sagen wollte. = bedeutet ja immer Kopie. Wenn du keine Kopie willst, musst DU das ausdrücklich sagen, indem du ein & anhängst... War ja schon immer so, und hat sich auch bei auto nicht geändert.

    phlox81 schrieb:

    Wer auto in range-for nutzt, sollte die referenz nicht vergessen, sonst erzeugt jede Iteration eine Kopie.

    Auch bei built-in Typen? Oder gilt hier dieselbe Regel wie bei Funktionsparametern?



  • Auch bei built-in Typen? Oder gilt hier dieselbe Regel wie bei Funktionsparametern?

    Ja, der Typ wird deduziert wie Template-Argumente bei einem Funktionstemplate-Aufruf.
    Das bedeutet, qualifizierst du auto nicht mit einem &, dann gibt es immer eine lvalue-to-rvalue conversion.


Anmelden zum Antworten