copy and swap技巧与移动赋值操作符
最近在实现一个Delegate类的时候碰到了一个问题,就是copy and swap技巧和移动赋值操作符有冲突。
比如有以下一个类:
class Fun
{
public:
Fun(const Fun& rhs) throw();
Fun& operator=(Fun fun)
{
swap(fun);
return *this;
}
void swap(Fun& other) throw();
};
这个类实现了copy and swap技巧,在赋值的时候表现的很好。但是如果再加入移动赋值操作符,编译器就不认了:
class Fun
{
//...
Fun& operator=(Fun fun)
{
swap(fun);
return *this;
}
Fun& operator=(Fun&& fun)
{
swap(fun);
return *this;
}
//...
};
Fun f;
f = Fun(); //报错
当你调用赋值操作符时,编译器会提示有两个赋值操作符,不知道该调用哪一个!
移动赋值操作符的引入就是为了优化用右值赋值的情况,而copy and swap本身就运用了处理右值情况的技巧,所以在这里会出现冲突。因此如果使用了copy and swap技巧,那么移动赋值操作符就可以省略了,下面是copy and swap技巧的C++11写法:
class Fun
{
public:
Fun(const Fun& rhs) throw();
Fun(Fun&& rhs) throw()
//记得数据初始化
{
swap(rhs);
}
Fun& operator=(Fun rhs)
{
swap(rhs);
return *this;
}
void swap(Fun& other) throw();
};
不过如果数据结构比较复杂,不适合用copy and swap技巧,那么就需要显式的定义左值赋值操作符和右值赋值操作符了:
class Fun
{
//...
Fun& operator=(const Fun& fun); //左值赋值操作符
Fun& operator=(Fun&& fun); //右值赋值操作符
//...
};
参考文献:http://stackoverflow.com/questions/19841626/move-assignment-incompatable-with-standard-copy-and-swap
copy and swap技巧与移动赋值操作符的更多相关文章
- C++ 之 重载赋值操作符
Widget 类中,定义了一个 Bitmap 类型的私有数据成员 -- pb 指针 class Bitmap { ... }; class Widget { private: Bitmap *pb; ...
- C++异常安全、copy and swap
异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异常时,这个异常 能保持原样传递到外层调用代码.(异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异 ...
- C++重载赋值操作符
1.C++中重载赋值操作函数应该返回什么? 类重载赋值操作符一般都是作为成员函数而存在的,那函数应该返回什么类型呢?参考内置类型的赋值操作,例如 int x,y,z; x=y=z=15; 赋值行为相当 ...
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
转自 http://www.jb51.net/article/37527.htm,感谢作者 #include "stdafx.h" #include <iostre ...
- C++中复制构造函数与重载赋值操作符总结
前言 这篇文章将对C++中复制构造函数和重载赋值操作符进行总结,包括以下内容: 1.复制构造函数和重载赋值操作符的定义: 2.复制构造函数和重载赋值操作符的调用时机: 3.复制构造函数和重载赋值操作符 ...
- C++中复制构造函数与重载赋值操作符
我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类: class CTe ...
- C++中复制构造函数和赋值操作符
先看一个例子: 定义了一个类:
- 赋值操作符、复制构造函数、析构函数、static成员练习
/** * 定义一个Employee类,包含雇员名字和一个唯一的雇员标识,为该类定义默认构造函数和参数为表示 * 雇员名字的string构造函数.如果该类需要复制构造函数或赋值操作符,实现这些函数 * ...
- [C++]复制构造函数、赋值操作符与隐式类类型转换
问题:现有类A定义如下: class A{public: A(int a) //构造函数 { ...
随机推荐
- [板子]KMP
KMP板子,你甚至可以用这个板子A掉luogu的3375 基础懒得说,要求一个Next数组. #include<cstdio> #include<algorithm> #inc ...
- 一个APP从启动到主页面显示经历了哪些过程?
①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求: ②system_server进程接收到请求后,向zygote进程 ...
- Eclipse 代码快捷键模板(一)
话不多说,自行google. 设置快捷键,打开eclipse,依次打开:Window -> Preferences -> General -> Key. 设置代码快捷键,打卡ecli ...
- Docker Desktop: Error response from daemon: driver failed programming external connectivity on endpoint xxx 问题
右击任务栏 Docker 图标 `Restart` 或 `Quit Docker Deskto` 后之前正常的 zookeeper 容器不会自动启动 通过命令 docker start zk1 启动报 ...
- 23.logging
转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html 一 (简单应用) import logging logging.debug('de ...
- 记一次ftp错误
在一个ftp上,突然登不上 报错,使用浏览器登录,报此用户不是私密连接,然后使用服务器客户端登录尝试,错误信息如下: [root@test ~]# ftp *.*.*.* Connected to * ...
- ES6学习----let、const、解构赋值、新增字符串、模板字符串、Symbol类型、Proxy、Set
这篇es6的学习笔记来自于表哥 表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 ES6就是JS6,JS的第 ...
- Java高级特性——流
以上就是这段时间学习完流的知识以后我的总结,.mmap文件可以去我的github上获取:https://github.com/xiaozhengyu/StudyNotes.git
- SpringCloud入门系列0-Nacos的安装与配置
背景 工作有一些年头了,自从19年初彻底转了java(这又是另一篇心酸的故事),突然感觉自己荒废了好几年(不是说.net不好,而是回顾自己这几年做的很多东西都浮于表面,有时候弄成很忙的样子,回头看看自 ...
- makefile个人理解
makefile makefile抽象层面的理解 学习某一样东西之前一定要明确学习的目的,即学习了这项工具能解决一些什么问题,其优势是什么? makefile的优势就是能够动态根据文件的新旧来决定是否 ...