【问题标题】:Should one use a std::move on a nullptr assignment?应该在 nullptr 分配上使用 std::move 吗?
【发布时间】:2013-08-06 21:19:08
【问题描述】:
我遇到了以下情况。在 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;
};
【问题讨论】:
标签:
c++11
move-semantics
nullptr
【解决方案1】:
nullptr 根据定义是一个右值(C++11 §2.14.7p1),所以std::move(nullptr) 是 nullptr。它没有任何效果,就像将任何其他右值文字传递给std::move 一样,例如std::move(3) 或std::move(true)。
【解决方案2】:
对任何 POD 类型使用 std::move 没有任何优势,并且指针是 POD 类型。 std::move 允许您移动一些数据而不是复制它。例如,如果您将std::move 一个std:string 插入另一个,则会复制指向底层存储的指针,而不是复制整个数组。但请注意,指针值仍在被复制。因此,如果您只使用指针,std::move 没有任何优势 - 指针是否为 null 并不重要。