#include <iostream>
using namespace std;
class C
{
public:
C(std::string someName) : name(someName) {}
void swap(C& other)
{
name.swap(other.name);
cout << "swap, other = " << other.name << "(" << &other << ")" << endl;
}
C(C&& other) // конструктор копирования
{
this->swap(other);
}
C& operator=(C other) // оператор присваивания
{ // передача параметра по значению важна!
swap(other); // обмен с временной копией
return *this;
}
std::string name;
};
int main(int argc, char* argv[])
{
C c1("c1");
C c2(c1);
cout << "c1 -> " << c1.name << endl;
cout << "c2 -> " << c2.name << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEMgCnsKICBwdWJsaWM6CiAgICBDKHN0ZDo6c3RyaW5nIHNvbWVOYW1lKSA6IG5hbWUoc29tZU5hbWUpIHt9CgogICAgdm9pZCBzd2FwKEMmIG90aGVyKQogICAgewogICAgICAgIG5hbWUuc3dhcChvdGhlci5uYW1lKTsKICAgICAgICBjb3V0IDw8ICJzd2FwLCBvdGhlciA9ICIgPDwgb3RoZXIubmFtZSA8PCAiKCIgPDwgJm90aGVyIDw8ICIpIiA8PCBlbmRsOwogICAgfQoKICAgIEMoQyYmIG90aGVyKSAvLyDQutC+0L3RgdGC0YDRg9C60YLQvtGAINC60L7Qv9C40YDQvtCy0LDQvdC40Y8KICAgIHsKICAgICAgICB0aGlzLT5zd2FwKG90aGVyKTsKICAgIH0KCiAgICBDJiBvcGVyYXRvcj0oQyBvdGhlcikgLy8g0L7Qv9C10YDQsNGC0L7RgCDQv9GA0LjRgdCy0LDQuNCy0LDQvdC40Y8KICAgIHsgICAgICAgICAgICAgICAgICAgICAvLyDQv9C10YDQtdC00LDRh9CwINC/0LDRgNCw0LzQtdGC0YDQsCDQv9C+INC30L3QsNGH0LXQvdC40Y4g0LLQsNC20L3QsCEKICAgICAgICBzd2FwKG90aGVyKTsgICAgICAvLyDQvtCx0LzQtdC9INGBINCy0YDQtdC80LXQvdC90L7QuSDQutC+0L/QuNC10LkKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgc3RkOjpzdHJpbmcgbmFtZTsKfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKICAgIEMgYzEoImMxIik7CiAgICBDIGMyKGMxKTsKICAgIGNvdXQgPDwgImMxIC0+ICIgPDwgYzEubmFtZSA8PCBlbmRsOwogICAgY291dCA8PCAiYzIgLT4gIiA8PCBjMi5uYW1lIDw8IGVuZGw7Cn0=