Подтвердить что ты не робот

Следует ли использовать std:: move для назначения nullptr?

Я наткнулся на следующее. Есть ли какое-либо преимущество для перемещения по nullptr? Я предполагаю, что он в основном присваивает ноль Node *, поэтому я не уверен, есть ли какое-то преимущество для совершения движения здесь. Любые мысли?

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

Ответ 1

nullptr по определению является rvalue (С++ 11 §2.14.7p1), поэтому std::move(nullptr) - nullptr. Это не имеет никакого эффекта, как и в случае передачи любого другого литерала rvalue на std::move, например, std::move(3) или std::move(true).

Ответ 2

Нет никакого преимущества в использовании std:: move для любого типа POD, а указатель - тип POD. std::move позволяет перемещать некоторые данные, а не копировать их. Например, если вы std::move один std:string в другой, указатель на базовое хранилище копируется вместо всего массива, который копируется. Но учтите, что значение указателя все еще копируется. Таким образом, если все, с чем вы работаете, - это указатель, std::move не имеет никакого преимущества - не имеет значения, является ли этот указатель null или нет.