2013-08-06 17 views
10

Ich stieß auf Folgendes. Gibt es einen Vorteil, einen Zug auf dem Nullptr zu machen? Ich nehme an, dass es Node * grundsätzlich eine Null zuweist, also bin ich mir nicht sicher, ob es einen Vorteil hat, hier einen Zug zu machen. Irgendwelche Gedanken?Sollte man eine std :: move auf eine Nullptr-Zuweisung verwenden?

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; 
}; 

Antwort

19

nullptr ist per Definition ein rvalue (C++ 11 §2.14.7p1), so std::move(nullptr)istnullptr. Es hat keine Wirkung, genau wie dies der Fall wäre, wenn irgendein anderes rvalue-Literal an std::move übergeben würde, z. B. std::move(3) oder std::move(true).

1

Es gibt keinen Vorteil für die Verwendung von std :: move für einen POD-Typ, und ein Zeiger ist ein POD-Typ. std::move können Sie einige Daten verschieben, anstatt sie zu kopieren. Zum Beispiel, wenn Sie eine std::move eine std:string in eine andere, der Zeiger auf den zugrunde liegenden Speicher kopiert wird, anstatt das gesamte Array kopiert wird. Beachten Sie jedoch, dass der Zeigerwert noch kopiert wird. Wenn Sie also nur mit dem Zeiger arbeiten, hat std::move keinen Vorteil - es spielt keine Rolle, ob dieser Zeiger null ist oder nicht.

Verwandte Themen