在变量可能被当作为rvalue时,一定要有该类型的move版本,即move ctor, move assignment。
E.g.临时变量会被当做rvalue塞入容器中,那这个临时变量的定义中一定要有move版本。
struct node {string m_msg;int m_priority;node(string msg, int priority):m_msg(msg), m_priority(priority) {// cout << "default ctor" << endl;}node(const node& x):m_msg(x.m_msg), m_priority(x.m_priority) {// cout << "copy ctor" << endl;}node(node&& x) noexcept :m_msg(x.m_msg), m_priority(x.m_priority) {// cout << "move ctor" << endl;// m_msg.assign(move(x.m_msg));}node& operator= (const node& x) {}node& operator= (node&& x) noexcept {m_msg.assign(move(x.m_msg));}bool operator< (const node& x) const {return m_priority > x.m_priority;}
};
虽然move对于常量的操作几乎不做什么事情,依然是copy,但是!!!如果要用到rvalue操作时,该类型还是得需要有move copy和move assignment。
在临时变量作为rvalue时,假如没有该临时变量类型得move版本的话,编译器会为我们进行自动转换,将临时变量转换成lvalue,然后再调用该变量类型的copy ctor。这样的一来二去:rvalue->lvalue,lvalue->copy ctor的过程浪费了很多时间。不如有move版本的直接:rvalue->move ctor。