2013-08-06 32 views
10

Natknąłem się na następujące. Czy jest jakaś korzyść z robienia ruchu na nullptr? Zakładam, że zasadniczo przypisuje zero do Węzła *, więc nie jestem pewien, czy jest jakaś korzyść, aby wykonać ruch tutaj. jakieś pomysły?Należy użyć std :: move na zlecenie 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; 
}; 

Odpowiedz

19

nullptr z definicji rvalue (C++ 11 §2.14.7p1) tak std::move(nullptr)jestnullptr. Nie ma ona żadnego skutku, tak jak w przypadku przekazywania dowolnego innego znaku rvalue do std::move, np. std::move(3) lub std::move(true).

1

Nie ma żadnej korzyści z używania std :: move dla dowolnego typu POD, a wskaźnik to typ POD. std::move umożliwia przenoszenie niektórych danych zamiast ich kopiowania. Na przykład, jeśli masz std::move jeden std:string w drugim, wskaźnik do podstawowej pamięci zostanie skopiowany zamiast całej skopiowanej tablicy. Należy jednak pamiętać, że wartość wskaźnika nadal jest kopiowana. Zatem jeśli wszystko, z czym pracujesz, jest wskaźnikiem, std::move nie ma żadnej przewagi - nie ma znaczenia, czy wskaźnik ten jest null czy nie.