使用右值参考移动临时值

时间:2014-09-22 01:13:48

标签: c++ c++11 move-semantics

我正在尝试精益移动语义,我写了这个例子。我想将临时r值移动到堆栈中的对象上。

class MemoryPage
{
    public:

    size_t size;
    MemoryPage():size(0){
    }
    MemoryPage& operator= (MemoryPage&& mp_){
        std::cout << "2" <<std::endl;
        size = mp_.size;
        return *this;
    }
};
MemoryPage getMemPage()
{
    MemoryPage mp;
    mp.size = 4;
    return mp;
}
int main() {
    MemoryPage mp;
    mp = getMemPage();
    std::cout << mp.size;
    return 0;
}

我在getMemPage()返回时遇到此错误:

error: use of deleted function 'constexpr MemoryPage::MemoryPage(const MemoryPage&)'

1 个答案:

答案 0 :(得分:0)

copy constructor是:

  如果满足以下任一条件,则

[...]定义为已删除:

     
      
  • T具有用户定义的移动构造函数或移动赋值运算符
  •   

为了解决当前问题,您只需提供一个复制构造函数,即:

MemoryPage(const MemoryPage&) { }

但是,正如评论中所述,咨询Rule-of-Three becomes Rule-of-Five with C++11? 是个好主意。特别是,本段总结了如果您忽略提供任何特殊成员函数可能遇到的问题:

  

请注意:

     
      
  • 移动构造函数并不会为显式声明任何其他特殊成员的类生成移动赋值运算符   功能

  •   
  • 不会为显式声明移动构造函数或移动赋值的类生成复制构造函数和复制赋值运算符   操作

  •   
  • 具有显式声明的析构函数和隐式定义的复制构造函数或隐式定义的复制赋值运算符的类   被视为已弃用。

  •   
为便于阅读而

格式化

因此,编写一个处理内存管理的类来提供所有五个特殊成员函数是很好的做法,即:

class C {
  C(const C&) = default;
  C(C&&) = default;
  C& operator=(const C&) & = default;
  C& operator=(C&&) & = default;
  virtual ~C() { }
};