使用std::move移动内容失败
failed to move contents with std::move
我试图用一个简单的例子(下面)来理解std::是如何移动的。基本上,我试图将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 EMPTYn";
// prints I'M NOT EMPTY
}
move函数不能保证清除源对象的内容。但是,它保证保持在这样一种状态,您可以安全地销毁它或为它赋一个新值。
也许这个
为什么移动指针变量不设置为空?可以澄清代码中发生了什么。正如riv所指出的,std::move没有理由将指针赋值为NULL。
这个参考http://en.cppreference.com/w/cpp/utility/move有使用std::move时未定义行为的好例子。
不幸的是,std::move
没有实现c++ 11新手通常期望的功能。c++标准将其定义为简单的static_cast
,因此它本身并不实际修改给定的对象。通常期望std::move
会以某种方式清除或零化正在移动的对象,但正如这里所解释的,这根本不是c++标准所要求的。
同样,riv的答案只有部分正确。他所说的保证并不是真正与std::move
有关,它更多地与右值引用有关,并且保证通常与move构造函数和move赋值一起讨论。如果你想了解更多关于std::move
,右值等的背景知识,我强烈推荐Thomas Becker的讨论,这是互联网上关于该主题的最受参考的网站之一。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 为什么将boost::move()的返回值分配给非常数引用在C++0x模式下失败,但在C++03模式下有效
- c++.系统调用move什么时候会失败
- 为什么这个非常简单的返回 std::move(线程句柄)失败
- 使用std::move移动内容失败