std::move(var)--- 作用是类型转换:接受一个左值作为参数,返回其右值引用 所以此时使用Obj b(std::move(a)),就用移动构造初始化了对象b 很多类的成员函数实际上都实现了这两种方法,比如vector的push_back(): // std::vector方法定义voidpush_back(consttype & value);voidpush_back(type && value);vector...
assignedObj没有使用std::move函数,它将调用的是 赋值构造函数,会进行深拷贝操作,拷贝之后内存中存储了两份相同的数据。 movedObj使用了std::move函数,它将调用的是 移动赋值构造函数,不会进行深拷贝操作,而是进行移动(swap)操作,只是将两者的内存空间进行交换,内存中还是只有一份数据。 如果MyObject 是一个非常大...
make_move(x) //此时x是左值,什么叫左值,就是可以取地址的变量。&x有意义的变量。 make_move(20) //20是真正的右值。 看上去这个时候make_move体现出了意义,把t强转成右值引用了。 但读过模板类型推倒、auto推导后,我们知道,左值(或引用)的强制右值转换返回是个左值引用。简单的如下: 于是,经过make_move...
std::move(__str._M_get_allocator())){if(__str._M_is_local()){traits_type::copy(_M_local_buf,__str._M_local_buf,_S_local_capacity+1);【1】//这是内部资源没有使用heap的情况,无法移动资源指针,只能使用copy的方式}else{_M_data(__str._M_data());【2】//使用str的指针数据设置当...
左值和右值我们上次已经详细介绍过了。下面解释下将亡值:将亡值从字面上理解,是生命周期将要结束的值。下面是一个可以视作将亡值的例子: #include<iostream> #include<utility>// 包含 std::move classMyObject { public: MyObject() { std::cout <<"Constructor called"<< std::endl; ...