当按值从c ++函数返回对象时的左值/右值

时间:2017-01-08 11:44:47

标签: c++11

请帮助我了解以下3个案件中发生的事情。

在提供的代码中

#include <iostream>

using namespace std;

class Dummy {
public:
  string content;
  Dummy(string c) : content(c) { cout << "Constructor" << endl; }
  Dummy(const Dummy &o) : content(o.content) {
    cout << "Copy Constructor" << endl;
  }
  // Dummy(const Dummy &o) = delete;
  Dummy(Dummy &&o) noexcept {
    content = std::move(o.content);
    cout << "Move Constructor" << endl;
  }
  Dummy &operator=(const Dummy &o) {
    cout << "Assignment" << endl;
    content = o.content;
    return *this;
  }
  Dummy &operator=(Dummy &&o) {
    cout << "Move Assignment" << endl;
    content = std::move(o.content);
    return *this;
  }
  ~Dummy() { cout << "Destructor" << endl; }
};

Dummy returnDummyObject(string c) {
  Dummy d{c};
  return d;
}

void takeDummyParam(Dummy d) { cout << d.content << endl; }

int main() {

  cout << "Case 1" << endl;
  Dummy d1 = returnDummyObject("some string 1");

  cout << "Case 2" << endl;
  Dummy d2 = std::move(returnDummyObject("some string 2"));

  cout << "Case 3" << endl;
  Dummy d3 = Dummy{"some string 3"};

  cout << "Case 4" << endl;
  Dummy d4 = d3;
}

输出是:

Case 1
Constructor
Case 2
Constructor
Move Constructor
Destructor
Case 3
Constructor
Case 4
Copy Constructor
Destructor
Destructor
Destructor
Destructor

案例1究竟发生了什么? 我在该函数中创建了一个虚拟对象,然后使用它创建了另一个虚拟对象。它应该使用构造函数然后使用复制构造函数(或根据它是否返回lvalue或rvalue来移动构造函数)。

为什么案例2有效?函数返回的对象不应该是右值吗?我很困惑,因为std :: move将左值变为右值。

在案例3中,它只使用构造函数。我的假设是它将使用构造函数,然后使用复制构造函数。我可以在任何地方使用这样的构造而不进行任何不必要的复制吗?

Type t = Type{args}

提前致谢。我刚开始用c ++ primer第5版学习c ++。对上述案例感到困惑。

0 个答案:

没有答案