Nutzen der Rvalue Referenzen (use of rvalue reference)



  • Hallo C++ Gurus,

    Deutsch
    ich habe eine Verständnisfrage zu Rvalue Referenzen. Zuerst kommt der Beispielcode.

    #include <iostream>
    
    
    struct structPointer {
    	int integer;
    	int *integerPointer;
    };
    
    
    struct structPointer g_structObj1, g_structObj2;
    
    
    void lReferenceFunc( const int &value ) {
    	std::cout << "lReferenceFunc : " << value << std::endl;
    }
    
    
    void rReferenceFunc( const int &&value ) {
    	std::cout << "rReferenceFunc : " << value << std::endl;
    }
    
    
    void lReferenceMove( structPointer &structRef ) {
    	g_structObj1.integer = structRef.integer;
    	g_structObj1.integerPointer = structRef.integerPointer;
    	structRef.integer = 0;
    	structRef.integerPointer = nullptr;
    }
    
    
    void rReferenceMove( structPointer &&structRef ) {
    	g_structObj2.integer = structRef.integer;
    	g_structObj2.integerPointer = structRef.integerPointer;
    	structRef.integer = 0;
    	structRef.integerPointer = nullptr;
    }
    
    
    int main() {
    	auto integerValue = 1;
    	struct structPointer structObj = { 0, new int( 3 ) };
    	auto &lValueRef = integerValue;struct structPointer &lstructRef = structObj;
    	auto &&rstructRef1 = structObj;
    	// struct structPointer &&rstructRef2 = structObj; // cannot bind to lvalue
    	auto &&rValueRef = integerValue;
    	auto *lValuePointer = &lValueRef;
    	auto *rValuePointer = &rValueRef;
    
    	lReferenceFunc( integerValue );
    	// rReferenceFunc( integerValue ); does not work
    	// rReferenceFunc( rValueRef ); does not work, too
    	rReferenceFunc( 100 );
    	lReferenceMove( structObj );
    	rReferenceMove( { 0, new int( 10 ) } );
    
    	return 0;
    }
    
    • lValueRef und rValueRef haben aufgrund von Referenzen gleiche Werte (lValueRef and rValueRef are showing same value)
    • Ihre Adresse sind aufgrund von Referenzen ebenfalls gleich (Their address are also same)
    • Der einzige Unterschied ist nur bei Aufruf des Funktionsparameter, rReferenceFunc kann keinen Variable Name oder Referenzen verwenden ( The only difference is rReferenceFunc cannot use variable name or reference name, just only value)
    • Ich habe auch ein Beispiel lReferenceMove und rReferenceMove, beide können ebenfalls Werte verschieben, wo hat rvalue dann mehr Vorteile gegenüber lvalue Anwendung? (There are also example lReferenceMove und rReferenceMove, both are able to move the value, what is the advantange of using the rvalue reference instead of lvalue reference?)
    • Warum geht es rstructRef1 aber rstructRef2 ist nicht möglich

    Wo wird Rvalue eingesetzt, wo lvalue Referenz nicht funktioniert?

    English
    I have a question about Rvalue references. First of all the example code above

    • lValueRef and rValueRef are showing same value
    • Their address are also same
    • The only difference is rReferenceFunc cannot use variable name or reference name, just only value
    • There are also example lReferenceMove und rReferenceMove, both are able to move the value, what is the advantange of using the rvalue reference instead of lvalue reference?
    • Why does it work rstructRef1, but not rstructRef2?

    Where to use rvalue that lvalue cannot be used?



  • Teile deinen Beitrag bitte auf in einen deutschen und englischen Part ... So ein Mischmasch stört nur den Lesefluss und keiner mag sich deiner Frage mehr annehmen.



  • Dieser Beitrag wurde gelöscht!


  • @Fragender sagte in Nutzen der Rvalue Referenzen (use of rvalue reference):

    Teile deinen Beitrag bitte auf in einen deutschen und englischen Part ... So ein Mischmasch stört nur den Lesefluss und keiner mag sich deiner Frage mehr annehmen.

    Danke sehr für den Hinweis, umgesetzt.



  • Warum überhaupt deutsch & englisch? Alle sprechen hier deutsch und nahezu alle sprechen auch englisch. Normalerweise wird alles auf deutsch geschrieben hier. Sofern dir aber Englisch lieber ist, schreib einfach in Englisch. Passt auch.



  • @JnZn558 sagte in Nutzen der Rvalue Referenzen (use of rvalue reference):

    umgesetzt

    Danke, sieht schon besser aus 😉



  • @Leon0402

    Ich bin schon lange nicht mehr auf diesem Platform, weiss nicht ob es hier auch nur English-Sprechende Gurus sind. Daher in zwei Sprachen



  • Sobald etwas einen Namen hat, kann es nicht mehr verwendet werden um eine Rvalue-Referenz zu initialisieren. Daher funktioniert rReferenceFunc( integerValue ); nicht.
    Aus dem selben Grund kann auch rReferenceFunc( rValueRef ); nicht funktionieren, selbst wenn rValueRef eine Rvalue-Referenz wäre.

    Weiters kommt noch dazu dass auto&& nicht das macht was du vermutlich erwartest. auto&& foo wird nicht immer zu einer Rvalue-Referenz. Ob foo eine Rvalue- oder Lvalue-Referenz wird, hängt davon ab womit es initialisiert wird. Wenn es mit einer Lvalue initialisiert wird, dann wird foo eine Lvalue-Referenz, und wenn es mit einer Rvalue initialisiert wird, dann wird es eine Rvalue-Referenz.

    D.h. rValueRef in deinem Beispiel ist gar keine Rvalue-Referenz.



  • @hustbaer sagte in Nutzen der Rvalue Referenzen (use of rvalue reference):

    Sobald etwas einen Namen hat, kann es nicht mehr verwendet werden um eine Rvalue-Referenz zu initialisieren. Daher funktioniert rReferenceFunc( integerValue ); nicht.
    Aus dem selben Grund kann auch rReferenceFunc( rValueRef ); nicht funktionieren, selbst wenn rValueRef eine Rvalue-Referenz wäre.

    Weiters kommt noch dazu dass auto&& nicht das macht was du vermutlich erwartest. auto&& foo wird nicht immer zu einer Rvalue-Referenz. Ob foo eine Rvalue- oder Lvalue-Referenz wird, hängt davon ab womit es initialisiert wird. Wenn es mit einer Lvalue initialisiert wird, dann wird foo eine Lvalue-Referenz, und wenn es mit einer Rvalue initialisiert wird, dann wird es eine Rvalue-Referenz.

    D.h. rValueRef in deinem Beispiel ist gar keine Rvalue-Referenz.

    Das ist wohl eine Falle auto &&, es kann eine r value und l value sein, je nach was auf der rechte Seite steht. Danke für den Hinweis


Anmelden zum Antworten