深入理解std::move

最近看到std::move()的神奇操作,能把std::string的字符串掏空?快吓懵我了,决定深究其原理,呵呵。

查看源码:

template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&& move(_Tp&& __t) noexcept
{
	return static_cast<typename std::remove_reference<_Tp>::type&&>(__t);
}

天下乌鸦一般黑,不就是个强转换嘛,吓得我快死了。

假设typename 是std::string类型:
std::string str;

那么std::move(str);

等同:static_cast<std::string&&>(str);

等同:(std::string&&)(str);

 

g++ test.cpp -o test -std=c++11

test.cpp

#include <stdio.h>
#include <string>
#include <utility>
#include <iostream>

class MyString : public std::string
{
public:
	MyString() : std::string() {
		printf("MyString:1\n");
	}
	
	MyString(const char* data) : std::string(data) {
		printf("MyString:2\n");
	}
	
	MyString(MyString&& str) : std::string( std::move(str) ) {
		printf("MyString:3\n");
	}
	
	MyString operator = (MyString&& str){
		this->swap(str);        // 试试把它注释掉你就知道了
		printf("operator:1\n");
	}
};
 
int main(int argc, char* argv[])
{
	MyString str1 = "123";
	std::cout << "str1=" << str1 << std::endl;
	std::cout << "----------" << std::endl;
#if 1
	// 下面三句同等效果,呵呵
	MyString str2 = "456";
	str2 = (MyString &&)(str1);
	//MyString str2 = static_cast<MyString&&>(str1);
	//MyString str2 = std::move(str1);
#else
	// 下面三句同等效果,呵呵
	MyString str2 = (MyString &&)(str1);
	//MyString str2 = static_cast<MyString&&>(str1);
	//MyString str2 = std::move(str1);
#endif
	std::cout << "str1=" << str1 << std::endl;
	std::cout << "str2=" << str2 << std::endl;
	return 0;
}

输出结果:

MyString:2
str1=123
----------
MyString:2
operator:1
str1=456
str2=123

如果把重载函数里面的this->swap(str);注释掉会有另一种结果。

MyString operator = (MyString&& str){
        // this->swap(str);    // 试试把它注释掉你就知道了
        printf("1111111\n");
}

输出结果:

MyString:2
str1=123
----------
MyString:2
operator:1
str1=123
str2=456

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值