2016-04-06 6 views
2

Ich möchte mein Verständnis der eindeutigen Zeiger xvalue ArgumenteEindeutige Zeiger xvalue Semantik? Warum unterscheidet sich das Verhalten von Lambda f2 von Lambda f1?

Dies ist ein Beispiel Code, den ich geschrieben habe, um std :: move und eindeutige Zeiger zu lernen. Kann jemand erklären, warum line2 abstürzt, aber line1 funktioniert? Was macht das Verschieben in Lambda f2 in meinem Testprogramm? Warum funktioniert Zeile1 auch nach einem std :: move? Dies ist nur für mein Lernen und kein Hausaufgabe Problem, sie ist sehr neu in C++ 14 und C 11 ++

#include <iostream> 
#include <functional> 
#include <memory> 

void test() 
{ 

    std::unique_ptr<int> p (new int(278)); 
    auto f1 = [](std::unique_ptr<int> i){std::cout << *i << std::endl;}; 
    auto f2 = [](std::unique_ptr<int> &&i){std::cout << *i << std::endl;}; 

    f2(std::move(p)); 
    std::cout << *p << std::endl; //line 1 

    f1(std::move(p)); 
    std::cout << *p << std::endl; //line 2 
} 

int main(int argc, const char * argv[]) { 
    test(); 
    return 0; 
} 
+0

hinzugefügt die Bearbeitungen, es hat nicht kompiliert, weil ich die Header nicht hinzugefügt enthält –

+0

Ich bin den gesamten Code von Xcode Version 7.2 einfügen. Ja sorry das ist ein Tippfehler. Es tut mir sehr leid –

+0

Apple LLVM 7.0, korrigierte ich die Tippfehler in endl. Danke für den Fang –

Antwort

0

Linie 1 funktioniert, weil std :: Umzug ist nur ein gegossenes zu r-Referenzwert . Die tatsächliche Übertragung von Eigentumsrechten erfolgt normalerweise durch den move-Konstruktor oder den move-Zuweisungsoperator, von denen keiner in f2 ist. Zeile 2 stürzt ab, weil die Übergabe von Argument nach Wert in f1 den Konstruktor move aufruft, nach dem unique_ptr leer ist.

Verwandte Themen