当前位置: 代码迷 >> 综合 >> c++11新特性:move注意事项
  详细解决方案

c++11新特性:move注意事项

热度:93   发布时间:2024-02-13 10:51:59.0

在变量可能被当作为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。

  相关解决方案