请帮助我了解以下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 ++。对上述案例感到困惑。