Следует ли использовать 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;
};
Ответы
Ответ 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
или нет.