为什么在按值返回对象时不调用移动构造函数?

时间:2014-11-19 05:16:16

标签: c++ c++11

我目前正在阅读有关移动构造函数的信息。我写了以下代码

#include <iostream>
#include <cstring>

class foo
{
  private:
  std::string str_member;
  char* char_member ;

  public:
  foo()
  {
    std::cout << "Regular constructor \n";
  }

  foo(const foo& r)
  {
    std::cout << "Copy Constructor \n";

    //Make copies of the contents
    char_member = new char[strlen(r.char_member)+1];
    strcpy(char_member,r.char_member);

    str_member = r.str_member;
  }

  foo& operator=(const foo& r)
  {
    //Do somestuff
    std::cout << "Copy Assignment operator \n";
  }

  //Move Special Member functions

  //Move constructor
  foo(foo&& r)
  {
    //Do somestuff
    std::cout << "move constructor \n";
  }

  //Move Assigment operator
  foo& operator=(foo&& r)
  {
    //Do some stuff
    std::cout << "Move assignment operator";
  }
};


//Some Method that returns an object by value
foo Mymethod()
{   
    foo d;
    return d;
}

int main()
{
    foo p(Mymethod());
    std::cin.get();
}

输出是&#34;常规构造函数&#34;。

现在上面的类只是一个测试类,并没有真正具有正确的复制/赋值/移动构造函数或移动赋值。我目前只对了解何时调用移动构造函数感兴趣。根据我的理解,当函数返回时,应该调用move构造函数,然后返回rvalue,然后调用另一个移动构造函数。

我看过When Does Move Constructor get called?aschepler声明:

  

调用移动构造函数:

     
      
  • [..]
  •   
  • 在抛出函数本地类对象时,编译器没有完全消除复制/移动
  •   

为什么我只获得常规构造函数。如果有人能向我解释为什么我的理解是错误的,我将不胜感激。我相信当从方法返回对象时应该调用移动构造函数,然后应该调用foo p的移动构造函数。

0 个答案:

没有答案