文档章节

右值引用&& 和 语意转移 std::move

梦想游戏人
 梦想游戏人
发布于 2015/06/06 22:44
字数 585
阅读 398
收藏 0

左值与右值的定义

C++( 包括 C) 中所有的表达式和变量要么是左值,要么是右值。通俗的左值的定义就是非临时对象,那些可以在多条语句中使用的对象。

所有的变量都满足这个定义,在多条代码中都可以使用,都是左值。右值是指临时的对象,它们只在当前的语句中有效(比如立即数,未命名对象)


 //注意  考虑到安全因素,具名变量即使被声明为右值类型也不会被当作右值 而要用std::move函数(以下说明)


右值引用 实现了 语意转移 和  完美转发


语意转移 std::move

用途 没有了无意义的拷贝工作,效率大大提升

编译器只对右值引用才能调用转移构造函数和转移赋值函数,而所有命名对象都只能是左值引用,如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数,也就是把一个左值引用当做右值引用来使用,怎么做呢?标准库提供了函数 std::move,这个函数以非常简单的方式将左值引用转换为右值引用。

示例1
        string str_1 = "123";

	string s(std::move(str_1));/*str_1被转移构造到了s*/  //string(&&)
	//string s2(str_1);/*拷贝构造函数*/  //string(string&)
	

	std::cout << s << endl;;/*123*/
	cout << str_1 << endl;/*str_1已被转移 所以为空*/
	
	
	
示例2
#include<iostream>
#include "vector"
#include "string"
#include "functional"
#include "windows.h"
using namespace std;


class _string
{
public:
	char*_data;
	void alloc()
	{
		_data = (char*)malloc(sizeof(char)* 100);
	}

	_string&operator=(const char*s)
	{
		cout << "call =const char*" << endl;
		strcpy(_data, s);
		return *this;
	}

	_string &operator=(const _string& s)
	{
		cout << "call = const string&" << endl;
		strcpy(_data, s.c_str());
		return *this;

	}
	_string &operator=(_string&&s)
	{
		cout << "call =string&&" << endl;
		this->_data = s._data;
		s._data = 0;
		return *this;
	}


	_string(_string&&s)
	{
		cout << "call   string  string &&" << endl;
		this->_data = s._data;
		s._data = 0;

	}

	_string(_string&s)
	{
		alloc();
		cout << "call   string  string &" << endl;
		strcpy(_data, s.c_str());

	}



	_string(const char*s)
	{
		alloc();
		cout << "call   string  const char*" << endl;
		strcpy(_data, s);


	}


	_string(const _string&s)
	{
		alloc();
		cout << "call   string  const string &" << endl;
		strcpy(_data, s.c_str());
	}


	_string()
	{
		alloc();
		cout << "call   string" << endl;
		strcpy(_data, "\0");
	}
	~_string()
	{
		if (_data)
		{
			cout << "call ~_stirng with free" << endl;
			free(_data);
			return;
		}
		cout << "call ~_stirng" << endl;
	}

	const	char* c_str() const
	{

		return (const char*)_data;
	}
};




_string func()
{
	_string str = "65546465";


	//return str;
	return std::move(str);
}


int main()
{
	//{



		_string&& s = (func());
	//}


	system("pause");
	return 0;

}





© 著作权归作者所有

共有 人打赏支持
梦想游戏人
粉丝 35
博文 435
码字总数 123998
作品 0
成都
私信 提问
C++11 标准新特性: 右值引用与转移语义

C++11 标准新特性: 右值引用与转移语义 C++ 的新标准 C++11 已经发布一段时间了。本文介绍了新标准中的一个特性,右值引用和转移语义。这个特性能够使代码更加简洁高效。 新特性的目的 右值引...

雅各宾
2014/01/17
0
0
C++临时对象(1)

作者:唐风 出处: http://www.cnblogs.com/liyiwen 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 C++ 是一门...

长平狐
2012/10/08
116
0
C++11新特性:std::move()和std::forward()

C++11通过std::move()和std::forward()函数分别实现了左值转右值和完美转发的功能。 对于std::move(),考虑如下情形: void func(int &&args) { std::cout << args << std::endl; } int a = ......

yepanl
08/17
0
0
C++11新特性:左值,右值,左值引用和右值引用

C++11新引入了右值引用的概念。 本质上来说,左值就是在内存中可以寻址的对象(表现形式是可以通过&操作符取指),而右值是在寄存器中或者内存中的匿名对象。 左值可以存在赋值运算符左右两边...

yepanl
08/16
0
0
[译]详解C++右值引用

C++0x标准出来很长时间了,引入了很多牛逼的特性[1]。其中一个便是右值引用,Thomas Becker的文章[2]很全面的介绍了这个特性,读后有如醍醐灌顶,翻译在此以便深入理解。 目录 概述 move语义...

wangdy
2016/08/17
31
0

没有更多内容

加载失败,请刷新页面

加载更多

在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
17分钟前
0
0
分布式Session共享解决方案

分布式Session一致性? 说白了就是服务器集群Session共享的问题 Session的作用? Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。 客户端在第一次访...

Java干货分享
22分钟前
3
0
开源软件和开源模式面临的生存危机

导读 开源模式可能正面临一场危机。越来越多的开源软件和平台被大型云计算服务商融入自家的云服务体系,并以此获利颇丰,但并不支付费用,也没有对开源社区做出相应的回馈。而实际上,大部分...

问题终结者
24分钟前
2
0
让看不见的AI算法,助你拿下看得见的广阔市场

人工智能技术的飞速发展给各行各业都带来了深远的影响,AI已被视为企业提升运营效能、应对市场竞争的必经之路。然而对于一些企业而言,让AI真正实现落地和应用,并且创造价值,仍是一件需要努...

个推
29分钟前
1
0
用SAN还是NAS?我来告诉你

存储区域网络(SAN)是以一种结构连接的存储,通常通过交换机连接,使许多不同的服务器能够轻松访问存储设备。从服务器应用程序和操作系统的角度来看,访问SAN中的数据存储或直接连接的存储之间...

linux-tao
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部