2013-08-06 17 views
10

Mi sono imbattuto in quanto segue. C'è qualche vantaggio nel fare una mossa sul nullptr? Presumo che in pratica si assegni uno zero al nodo *, quindi non sono sicuro che ci sia qualche vantaggio nel fare una mossa qui. qualche idea?Si dovrebbe usare uno std :: move su un assegnamento nullptr?

template <typename T> 
struct Node 
{ 
    Node(const T& t): data(t), next(std::move(nullptr)) { } 
    Node(T&& t): data(std::move(t)), next(std::move(nullptr)) { } 

    T data; 
    Node* next; 
}; 

risposta

19

nullptr è per definizione un rvalue (C++ 11 §2.14.7p1), quindi std::move(nullptr)ènullptr. Non ha alcun effetto, proprio come sarebbe il caso di passare qualsiasi altro valore letterale a std::move, ad esempio std::move(3) o std::move(true).

1

Non c'è alcun vantaggio nell'usare std :: move per qualsiasi tipo di POD e un puntatore è un tipo POD. std::move consente di spostare alcuni dati anziché copiarli. Ad esempio, se si std:string in un altro, il puntatore all'archivio sottostante viene copiato anziché l'intero array che viene copiato. Ma si noti che il valore del puntatore è ancora in fase di copia. Quindi, se tutto ciò con cui stai lavorando è il puntatore, std::move non ha alcun vantaggio: non importa se quel puntatore è null oppure no.