- 此问题在此处已有答案**:
Why std::move() is not stealing an int value?(2个答案)
can I use std::move with class that doesn't provide a move constructor?(5个答案)
Do built-in types have move semantics?(1个答案)
std::move Bug Spotted in C++ Primer 5th Edition(2个答案)
5天前关闭。
如下例所示,我希望编译器添加一个隐式移动构造函数,将obj1
中的数据移动到obj2
中,并使obj1
为空或具有一些不确定状态。
#include <iostream>
#include <memory>
#include <mutex>
using namespace std;
class Demo
{
public:
int val = 3;
};
int main()
{
Demo obj1;
cout << "before move obj1.val :" << obj1.val << std::endl;
Demo obj2(std::move(obj1));
//Expecting obj1.val moves into obj2.val and becomes zero etc.
cout << "after move obj1.val :" << obj1.val << std::endl;
cout << "after move obj2.val :" << obj2.val << std::endl;
return 0;
}
//输出:
before move obj1.val :3
after move obj1.val :3
after move obj2.val :3
1条答案
按热度按时间bvjveswy1#
这是一个关于移动语义在C中的含义的常见误解。
这并不意味着"在极端酷刑、痛苦和折磨的惩罚下,你必须从被移走的物体上拿走一切,并把它放进被移走的物体中,一旦移动操作完成,除了一大片荒地和燃烧的残骸外,你什么也不能留下"。
它真正的意思是"以最有效的方式使moved-to对象与moved-from对象完全相同,将moved-from对象的状态转移到moved-to对象,并且允许你尽可能多地弄乱moved-from对象的内容,只要转移尽可能有效"。这就是C中move的意思(1)。
在move操作结束时,保持moved-from对象的状态不变是一个完全有效的结果,在使用短字符串优化的C实现中移动小的
std::string
时,经常会观察到这种情况。对于自然整数和数值类型,这是你唯一可能期望的结果,不需要额外的步骤来将moved-from字节设置为随机数生成器的内容,或者其他什么,这是最少的工作量:没有。
(1)形式上,C标准将其定义为移动对C库类型的影响,实际上,该定义也被所有其他C库采用。