#include <iostream>
#include <string>
using namespace std;
class Movable {
public:
Movable(const string& name) : m_name(name) { }
Movable(const Movable& rhs) {
cout << "Copy constructed from " << rhs.m_name << endl;
}
Movable(Movable&& rhs) {
cout << "Move constructed from " << rhs.m_name << endl;
}
Movable& operator = (const Movable& rhs) {
cout << "Copy assigned from " << rhs.m_name << endl;
}
Movable& operator = (Movable&& rhs) {
cout << "Move assigned from " << rhs.m_name << endl;
}
private:
string m_name;
};
int main() {
Movable obj1("obj1");
Movable obj2(std::move(obj1));
obj2 = std::move(obj1); // For demostration only
const Movable cObj("cObj");
Movable tObj(std::move(cObj));
tObj = std::move(cObj); // For demonstration only
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjbGFzcyBNb3ZhYmxlIHsKcHVibGljOgogICAgTW92YWJsZShjb25zdCBzdHJpbmcmIG5hbWUpIDogbV9uYW1lKG5hbWUpIHsgfQogICAgTW92YWJsZShjb25zdCBNb3ZhYmxlJiByaHMpIHsKICAgICAgICBjb3V0IDw8ICJDb3B5IGNvbnN0cnVjdGVkIGZyb20gIiA8PCByaHMubV9uYW1lIDw8IGVuZGw7CiAgICB9CiAgICAKICAgIE1vdmFibGUoTW92YWJsZSYmIHJocykgewogICAgICAgIGNvdXQgPDwgIk1vdmUgY29uc3RydWN0ZWQgZnJvbSAiIDw8IHJocy5tX25hbWUgPDwgZW5kbDsKICAgIH0KICAgIAogICAgTW92YWJsZSYgb3BlcmF0b3IgPSAoY29uc3QgTW92YWJsZSYgcmhzKSB7CiAgICAgICAgY291dCA8PCAiQ29weSBhc3NpZ25lZCBmcm9tICIgPDwgcmhzLm1fbmFtZSA8PCBlbmRsOwogICAgfQogICAgCiAgICBNb3ZhYmxlJiBvcGVyYXRvciA9IChNb3ZhYmxlJiYgcmhzKSB7CiAgICAgICAgY291dCA8PCAiTW92ZSBhc3NpZ25lZCBmcm9tICIgPDwgcmhzLm1fbmFtZSA8PCBlbmRsOwogICAgfQoKcHJpdmF0ZToKICAgIHN0cmluZyBtX25hbWU7Cn07CgoKaW50IG1haW4oKSB7CiAgICBNb3ZhYmxlIG9iajEoIm9iajEiKTsKICAgIE1vdmFibGUgb2JqMihzdGQ6Om1vdmUob2JqMSkpOwogICAgb2JqMiA9IHN0ZDo6bW92ZShvYmoxKTsgICAgIC8vIEZvciBkZW1vc3RyYXRpb24gb25seQogICAgCiAgICBjb25zdCBNb3ZhYmxlIGNPYmooImNPYmoiKTsKICAgIE1vdmFibGUgdE9iaihzdGQ6Om1vdmUoY09iaikpOwogICAgdE9iaiA9IHN0ZDo6bW92ZShjT2JqKTsgICAgIC8vIEZvciBkZW1vbnN0cmF0aW9uIG9ubHkKfQ==