文档章节

[C++ 学习笔记 2] 为什么会有移动构造函数、std::move?

UMU
 UMU
发布于 2017/01/05 17:30
字数 259
阅读 102
收藏 0

UMU 认为是为了:需求细分。考虑以下代码:

class Movable
{
public:
	Movable() : i(new int(3))
	{
		std::cout << __FUNCTION__ << std::endl;
	}

	Movable(Movable& m) : i(m.i)
	{
		m.i = nullptr; // 这里改变值是可以的
		std::cout << __FUNCTION__ << "&" << std::endl;
	}

	int* i;
};

因为 Movable& m 没有用 const 修饰,所以可以在内部改变 m 的状态。如果加上 const 则不行:

Movable(const Movable& m) : i(m.i)
{
	//m.i = nullptr; // 不能改变 m
	std::cout << __FUNCTION__ << "&" << std::endl;
}

那么没加 const 的集合,减去有 const 的集合,等于什么?答案就是:移动构造函数

Movable(Movable&& m) : i(m.i)
{
	m.i = nullptr;
	std::cout << __FUNCTION__ << "&&" << std::endl;
}

分成 const Movable& 和 Movable&& 两个,更严格、更清晰,这是好事。而 std::move 做的事情是为了正确调用移动构造函数(Movable&&),而不是被隐式转为 const 而错误地调用了复制构造函数(const Movable&),不要在意什么左值、右值的,太烧脑了……

扩展阅读:《从4行代码看右值引用》,http://www.cnblogs.com/qicosmos/p/4283455.html

 

© 著作权归作者所有

UMU

UMU

粉丝 119
博文 112
码字总数 44043
作品 0
厦门
程序员
私信 提问
最好的朋友:C++11 移动语义和 Pimpl 手法

当编译器可以用廉价的挪动操作替换昂贵的复制操作时,也就是当它可以用一个指向一个大对象的指针的浅层复制来替换对这个大对象的深层复制的时候,挪动语义要比复制语义更快速。因此,在类中利...

乌合之众
2016/06/08
3.5K
5
C++基础教程之string详情

string 初始化 首先,为了在程序中使用string类型,必须包含头文件 。如: #include 注意:这里不是string.h,string.h是C字符串头文件。 string类是一个模板类,位于名字空间std中,还需要加:...

这个人很懒什么都没留下
2018/09/01
0
0
Effective C++学习笔记-01

1.条款03:尽量使用const 1.1 const可以修饰指针,指针所指物,两者或者都不是const对象。注意const的位置,位于号左边的是修饰所指物为常量, 右边是修饰指针 const char* p = greeting //c...

亚历山大痒
2012/12/29
102
0
C++ 0x 之左值与右值、右值引用、移动语义、传导模板

左值与右值 左值与右值的概念要追溯到 C 语言,由 C++ 语言继承了上来。C++ 03 3.10/1 如是说:“Every expression is either an lvalue or an rvalue.”左值与右值是指表达式的属性,而非对...

雅各宾
2013/11/27
227
2
C++基础教程之C/C++区别

C/C++基础教程之C/C++区别 这是C++教程得第一步,后续会持续更新哦!欢迎新手(具有C基础),老鸟可绕道,可指导。 C++标准输入和输出 C++标准输入和输出分别是cin和cout,用法非常简单 cin>>n...

这个人很懒什么都没留下
2018/09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
57分钟前
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
59分钟前
5
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
6
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
4
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部