2017-01-03 13 views
5
class foo{ 
public: 
    bar steal_the_moveable_object(); 
private: 
    bar moveable_object; 
}; 

main(){ 
    foo f; 
    auto moved_object= f.steal_the_moveable_object(); 
} 

W jaki sposób można wdrożyć steal_the_movebale_object przenieść moveable_object do moved_object?Powrót ruchomą zmienną składową z klasy

+2

Czy na pewno tego chcesz? Biedny 'foo' będzie pozostawiony z kalekim członkiem. – Unimportant

+3

@Unimportant yes foo powiedział mi, że ma dość tego paska! –

Odpowiedz

6

można po prostu przenieść element bezpośrednio w instrukcji return:

class foo 
{ 
public: 
    bar steal_the_moveable_object() 
    { 
     return std::move(moveable_object); 
    } 
private: 
    bar moveable_object; 
}; 

Pamiętaj, że nie może to być dobry pomysł, choć. Rozważ użycie następujących opcji, aby metoda mogła wywoływać tylko wartości R:

class foo 
{ 
public: 
    bar steal_the_moveable_object() && // add '&&' here 
    { 
     return std::move(moveable_object); 
    } 
private: 
    bar moveable_object; 
}; 

int main() 
{ 
    foo f; 
    //auto x = f.steal_the_moveable_object(); // Compiler error 
    auto y = std::move(f).steal_the_moveable_object(); 

    return 0; 
} 
+0

Dzięki. W drugiej opcji, czy nie stracę obiektu f? w prawdziwym kodzie, foo zawiera inne elementy członkowskie varaibles nie tylko pasek jeden: –

+0

@HumamHelfawi: Nie, 'std :: move' jest tylko rzutem typu na końcu. Jeśli nie tworzysz kolejnego obiektu 'foo' z przeniesionym' z 'f', jesteś w porządku. – AndyG

+1

'std :: move (f)' jest rzutowaniem na 'foo &&'. Nie * faktycznie * unieważnia obiekt. Więc nadal możesz zdobyć innych członków, ale wynikowy kod (lub powinien) rzeczywiście podnosić brwi każdego przyszłego czytelnika. Być może możesz zamknąć operację przenoszenia kilku członków w nowej metodzie. [std :: move to misnomer] (http://stackoverflow.com/questions/21358432/why-is-stdmove-named-stdmove) –

Powiązane problemy