range-based for loop



  • wenn ich über einen container mit unique pointern laufe mittels einer range-based for schleife, muss ich ja lvalue references verwenden, da unique pointer nicht copy constructable sind, dh.

    std::vector<std::unique_ptr> range;
    // fill the vector
    
    for (auto & item : range)
     // ...
    

    was ist aber nun der Unterschied zu folgendem

    for(auto&& item : range)
    

    der doppelpunkt ist doch wie eine Initialisierung zu lesen, also binded hier das jeweilige item in der collection zu einer rvalue referenz. Aber wird damit nicht der Inhalt in der collection leer? dh range beinhaltet nach der loop nur noch nullptr?



  • Sewing schrieb:

    dh range beinhaltet nach der loop nur noch nullptr?

    Das könnte man schneller ausprobieren als hier eine Frage zu schreiben.



  • ich möchte ja nur gerne den Nutzen einer rvalue referenz an dieser Stelle erfragen


  • Mod

    Sewing schrieb:

    std::vector<std::unique_ptr> range;
    // fill the vector
    
    for (auto & item : range)
     // ...
    

    was ist aber nun der Unterschied zu folgendem

    for(auto&& item : range)
    

    In diesem konkreten Fall besteht kein Unterschied im Verhalten. Im Fall von auto&& ist der deduzierte Typ T, der auto substituiert, dann eben eine lvalue-Referenz, falls - wie meist der Fall - die Dereferenzierung eines Iterators ein lvalue ist. auto&& ist allgemeiner, weil es auch mit reinen Outputsequenzen, die rvalues liefern, zurecht kommt. Womit man sich eher nur in generischem Code auseinandersetzen muss.

    Sewing schrieb:

    ich möchte ja nur gerne den Nutzen einer rvalue referenz an dieser Stelle erfragen

    s.o. item ist hier immer noch eine lvalue-Referenz, selbst wenn du auto&& geschrieben hast.

    auto&& steht nicht für rvalue-Referenzen, sondern für die "richtige" Art Referenz im Kontext; d.h. das was Meyers als universelle Referenz bezeichnet.



  • ah verstehe, universal references treten aber ja sowieso nur bei template programmierung auf. danke ; )



  • Sewing schrieb:

    ah verstehe, universal references treten aber ja sowieso nur bei template programmierung auf. danke ; )

    Wie du gerade siehst eben nicht.


Anmelden zum Antworten