文档章节

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

梦想游戏人
 梦想游戏人
发布于 2015/06/06 22:44
字数 585
阅读 367
收藏 0
点赞 0
评论 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;

}





© 著作权归作者所有

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

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

雅各宾 ⋅ 2014/01/17 ⋅ 0

C++智能指针漫谈【中】

Boost::scoped_ptr Boost::scopedptr是指向自动(栈)对象的、不可复制(noncopyable)的智能指针。Boost::scopedptr模板类存储的是指向动态分配的对象(通过new 分配)的指针。被指向的对象...

开源中国驻成都办事处 ⋅ 2012/09/23 ⋅ 0

C++临时对象(1)

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

长平狐 ⋅ 2012/10/08 ⋅ 0

C++智能指针漫谈【上】

综述 由于C++缺乏语言级别的GC(Garbage Collection)支持,资源生命周期管理一直是一个棘手的问题。系统地解决这一问题的方法有两种: · 使用GC。但GC会带来额外的负担:内存占用率过高,这...

开源中国驻成都办事处 ⋅ 2012/09/23 ⋅ 13

[译]详解C++右值引用

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

wangdy ⋅ 2016/08/17 ⋅ 0

cannot convert ‘a’ (type ‘int’) to type ‘int&&’

背景 启用C++11编译老代码的时候,g++报错。示例代码如下: #include <utility> int main() { int a = 0; auto b = std::make_pair<int, int>(a, 1); return 0;} 出错信息: test.cpp: In f......

kyos ⋅ 2015/03/14 ⋅ 0

C++中string类的正确写法

C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源。具体来说: 能像 int 类型那样定义变量,并且支持赋值、复制。 ...

zhangyujsj ⋅ 2015/09/06 ⋅ 0

C++ Primer 读书笔记-ch02

引言 数据类型是程序的基础,决定了编译器以及运行时的各项操作解释。在编译时不同的变量应该分配多大的空间?在运行时对指针进行+1操作,指针应该跳几个字节?在类型明确的情况下,上述操作...

西昆仑 ⋅ 2016/04/04 ⋅ 0

表达式左值右值(C++学习)

左值右值是表达式的属性,该属性称为 value category。按该属性分类,每一个表达式属于下列之一: 而 xvalue 和其他两个类型分别复合,构成: 区分? ++x 与 x++ 假定x的定义为 int x=0;,那么...

晨曦之光 ⋅ 2012/05/08 ⋅ 1

c++ 11 新特性

new (std::nothrow)A()当内存不足时,返回null std::function<A(int)>代表一个可调用对象,接受1个int的参数,返回值是A 对于c++ 对象的方法,可以通过std::bind 转换为可调用对象 A a ...

yizhangxyz ⋅ 2016/04/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 53分钟前 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部