我试图通过一个简单的例子(下面)了解std :: move的方式。 基本上我正在尝试将p1的内容移到p2,所以p1在此之后是空的,但这不会发生。
我想我没有正确使用std :: move。如果有人能向我解释,我会非常感激。
#include <iostream>
#include <utility>
int main()
{
int * p1 = new int[10];
for(int i = 0; i < 10; ++i)
p1[i]=i;
// moving contents of p1 to p2
int * p2 = std::move(p1);
// I was expeting p1 now to be empty but it's not...
if(p1 != NULL)
std::cout << "I'M NOT EMPTY\n";
// prints I'M NOT EMPTY
}
答案 0 :(得分:2)
不保证移动功能可以清除源对象的内容。但是,保证保持这种状态,您可以安全地销毁它或为其分配新值。
答案 1 :(得分:1)
也许这个 Why does moving a pointer variable not set it to null?可以澄清代码中发生的事情。正如riv指出的那样,没有理由将std :: move赋值给你的指针。
这个引用http://en.cppreference.com/w/cpp/utility/move在使用std :: move时有很好的未定义行为示例。
答案 2 :(得分:0)
不幸的是,std::move
并没有做C ++ 11新手经常期待的事情。它由C ++标准简单地定义为static_cast
,因此它本身并没有实际修改它给出的对象。通常期望std::move
以某种方式清除或清除被移动的对象,但是explained here,这完全不是C ++标准所要求的。
此外,riv的回答只是部分正确。他所讨论的保证与std::move
没有关系,它与rvalue引用更相关,保证通常与移动构造函数和移动赋值一起讨论。如果您想了解std::move
,rvalues等的更多背景信息,我强烈推荐Thomas Becker's discussion,这是互联网上被引用最多的网站之一。