2013-08-06 1 views
10

Je suis tombé sur ce qui suit. Y at-il un avantage à faire un pas sur le nullptr? Je suppose qu'il attribue un zéro à Node * donc je ne suis pas sûr s'il y a un avantage à faire un mouvement ici. Des pensées?Faut-il utiliser un std :: move sur une affectation 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; 
}; 

Répondre

19

nullptr est par définition une rvalue (C++ 11 §2.14.7p1), de sorte std::move(nullptr)estnullptr. Il n'a aucun effet, tout comme cela serait le cas pour passer tout autre littéral rvalue à std::move, par exemple, std::move(3) ou std::move(true).

1

Il n'y a aucun avantage à utiliser std :: move pour n'importe quel type de POD, et un pointeur est un type POD. std::move vous permet de déplacer certaines données plutôt que de les copier. Par exemple, si vousun std:string dans un autre, le pointeur vers le stockage sous-jacent est copié au lieu de l'ensemble du tableau en cours de copie. Mais notez que la valeur du pointeur est toujours en cours de copie. Ainsi, si tout ce que vous utilisez est le pointeur, std::move n'a aucun avantage - peu importe si ce pointeur est null ou non.

Questions connexes