#include <iostream>
template <class T> void swap(T& a, T& b) {
T tmp(std::move(a));
std::cout << a->x << "(" << &a <<"), "; //note que aqui imprimo o endereço da variável que não varia
std::cout << b->x << "(" << &b <<"), ";
std::cout << tmp->x << "(" << &tmp <<")\n";
tmp->foo(3); //só para mostrar que funciona e altera tanto a quanto tmp.
std::cout << a->x << "(" << a <<"), "; //agora imprimo o valor dela que é o ponteiro e ele muda
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
a->foo(1); //confirmando que são o mesmo endereço
std::cout << a->x << "(" << a <<"), ";
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
a = std::move(b);
std::cout << a->x << "(" << a <<"), ";
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
b = std::move(tmp);
std::cout << a->x << "(" << a <<"), ";
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
}
template <class T> void old_swap(T& a, T& b) {
T tmp(a);
std::cout << a->x << "(" << &a <<"), "; //note que aqui imprimo o endereço da variável que não varia
std::cout << b->x << "(" << &b <<"), ";
std::cout << tmp->x << "(" << &tmp <<")\n";
tmp->foo(3); //só para mostrar que funciona e altera tanto a quanto tmp.
std::cout << a->x << "(" << a <<"), "; //agora imprimo o valor dela que é o ponteiro e ele muda
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
a->foo(1); //confirmando que são o mesmo endereço
std::cout << a->x << "(" << a <<"), ";
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
a = b;
std::cout << a->x << "(" << a <<"), ";
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
b = tmp;
std::cout << a->x << "(" << a <<"), ";
std::cout << b->x << "(" << b <<"), ";
std::cout << tmp->x << "(" << tmp <<")\n";
}
class teste {
public:
int x = 0;
int foo(int x);
};
int teste::foo(int x) {
return this->x = x;
}
int main() {
teste* a = new teste();
a->foo(1);
teste* b = new teste();
b->foo(2);
swap(a, b);
old_swap(a, b);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgc3dhcChUJiBhLCBUJiBiKSB7CiAgICBUIHRtcChzdGQ6Om1vdmUoYSkpOwogICAgc3RkOjpjb3V0IDw8IGEtPnggPDwgIigiIDw8ICZhIDw8IiksICI7IC8vbm90ZSBxdWUgYXF1aSBpbXByaW1vIG8gZW5kZXJlw6dvIGRhIHZhcmnDoXZlbCBxdWUgbsOjbyB2YXJpYQogICAgc3RkOjpjb3V0IDw8IGItPnggPDwgIigiIDw8ICZiIDw8IiksICI7CiAgICBzdGQ6OmNvdXQgPDwgdG1wLT54IDw8ICIoIiA8PCAmdG1wIDw8IilcbiI7CiAgICB0bXAtPmZvbygzKTsgLy9zw7MgcGFyYSBtb3N0cmFyIHF1ZSBmdW5jaW9uYSBlIGFsdGVyYSB0YW50byBhIHF1YW50byB0bXAuCiAgICBzdGQ6OmNvdXQgPDwgYS0+eCA8PCAiKCIgPDwgYSA8PCIpLCAiOyAvL2Fnb3JhIGltcHJpbW8gbyB2YWxvciBkZWxhIHF1ZSDDqSBvIHBvbnRlaXJvIGUgZWxlIG11ZGEKICAgIHN0ZDo6Y291dCA8PCBiLT54IDw8ICIoIiA8PCBiIDw8IiksICI7CiAgICBzdGQ6OmNvdXQgPDwgdG1wLT54IDw8ICIoIiA8PCB0bXAgPDwiKVxuIjsKICAgIGEtPmZvbygxKTsgLy9jb25maXJtYW5kbyBxdWUgc8OjbyBvIG1lc21vIGVuZGVyZcOnbwogICAgc3RkOjpjb3V0IDw8IGEtPnggPDwgIigiIDw8IGEgPDwiKSwgIjsKICAgIHN0ZDo6Y291dCA8PCBiLT54IDw8ICIoIiA8PCBiIDw8IiksICI7CiAgICBzdGQ6OmNvdXQgPDwgdG1wLT54IDw8ICIoIiA8PCB0bXAgPDwiKVxuIjsKICAgIGEgPSBzdGQ6Om1vdmUoYik7ICAgCiAgICBzdGQ6OmNvdXQgPDwgYS0+eCA8PCAiKCIgPDwgYSA8PCIpLCAiOwogICAgc3RkOjpjb3V0IDw8IGItPnggPDwgIigiIDw8IGIgPDwiKSwgIjsKICAgIHN0ZDo6Y291dCA8PCB0bXAtPnggPDwgIigiIDw8IHRtcCA8PCIpXG4iOwogICAgYiA9IHN0ZDo6bW92ZSh0bXApOwogICAgc3RkOjpjb3V0IDw8IGEtPnggPDwgIigiIDw8IGEgPDwiKSwgIjsKICAgIHN0ZDo6Y291dCA8PCBiLT54IDw8ICIoIiA8PCBiIDw8IiksICI7CiAgICBzdGQ6OmNvdXQgPDwgdG1wLT54IDw8ICIoIiA8PCB0bXAgPDwiKVxuIjsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgb2xkX3N3YXAoVCYgYSwgVCYgYikgewogICAgVCB0bXAoYSk7CiAgICBzdGQ6OmNvdXQgPDwgYS0+eCA8PCAiKCIgPDwgJmEgPDwiKSwgIjsgLy9ub3RlIHF1ZSBhcXVpIGltcHJpbW8gbyBlbmRlcmXDp28gZGEgdmFyacOhdmVsIHF1ZSBuw6NvIHZhcmlhCiAgICBzdGQ6OmNvdXQgPDwgYi0+eCA8PCAiKCIgPDwgJmIgPDwiKSwgIjsKICAgIHN0ZDo6Y291dCA8PCB0bXAtPnggPDwgIigiIDw8ICZ0bXAgPDwiKVxuIjsKICAgIHRtcC0+Zm9vKDMpOyAvL3PDsyBwYXJhIG1vc3RyYXIgcXVlIGZ1bmNpb25hIGUgYWx0ZXJhIHRhbnRvIGEgcXVhbnRvIHRtcC4KICAgIHN0ZDo6Y291dCA8PCBhLT54IDw8ICIoIiA8PCBhIDw8IiksICI7IC8vYWdvcmEgaW1wcmltbyBvIHZhbG9yIGRlbGEgcXVlIMOpIG8gcG9udGVpcm8gZSBlbGUgbXVkYQogICAgc3RkOjpjb3V0IDw8IGItPnggPDwgIigiIDw8IGIgPDwiKSwgIjsKICAgIHN0ZDo6Y291dCA8PCB0bXAtPnggPDwgIigiIDw8IHRtcCA8PCIpXG4iOwogICAgYS0+Zm9vKDEpOyAvL2NvbmZpcm1hbmRvIHF1ZSBzw6NvIG8gbWVzbW8gZW5kZXJlw6dvCiAgICBzdGQ6OmNvdXQgPDwgYS0+eCA8PCAiKCIgPDwgYSA8PCIpLCAiOwogICAgc3RkOjpjb3V0IDw8IGItPnggPDwgIigiIDw8IGIgPDwiKSwgIjsKICAgIHN0ZDo6Y291dCA8PCB0bXAtPnggPDwgIigiIDw8IHRtcCA8PCIpXG4iOwogICAgYSA9IGI7ICAgCiAgICBzdGQ6OmNvdXQgPDwgYS0+eCA8PCAiKCIgPDwgYSA8PCIpLCAiOwogICAgc3RkOjpjb3V0IDw8IGItPnggPDwgIigiIDw8IGIgPDwiKSwgIjsKICAgIHN0ZDo6Y291dCA8PCB0bXAtPnggPDwgIigiIDw8IHRtcCA8PCIpXG4iOwogICAgYiA9IHRtcDsKICAgIHN0ZDo6Y291dCA8PCBhLT54IDw8ICIoIiA8PCBhIDw8IiksICI7CiAgICBzdGQ6OmNvdXQgPDwgYi0+eCA8PCAiKCIgPDwgYiA8PCIpLCAiOwogICAgc3RkOjpjb3V0IDw8IHRtcC0+eCA8PCAiKCIgPDwgdG1wIDw8IilcbiI7Cn0KCmNsYXNzIHRlc3RlIHsKCXB1YmxpYzoKICAgIAlpbnQgeCA9IDA7CgkgICAgaW50IGZvbyhpbnQgeCk7Cn07CgppbnQgdGVzdGU6OmZvbyhpbnQgeCkgewoJcmV0dXJuIHRoaXMtPnggPSB4Owp9CgppbnQgbWFpbigpIHsKCXRlc3RlKiBhID0gbmV3IHRlc3RlKCk7CglhLT5mb28oMSk7Cgl0ZXN0ZSogYiA9IG5ldyB0ZXN0ZSgpOwoJYi0+Zm9vKDIpOwoJc3dhcChhLCBiKTsKCW9sZF9zd2FwKGEsIGIpOwoJcmV0dXJuIDA7Cn0KCg==
1(0xbfc92788), 2(0xbfc9278c), 1(0xbfc9274c)
3(0x8cb0008), 2(0x8cb0018), 3(0x8cb0008)
1(0x8cb0008), 2(0x8cb0018), 1(0x8cb0008)
2(0x8cb0018), 2(0x8cb0018), 1(0x8cb0008)
2(0x8cb0018), 1(0x8cb0008), 1(0x8cb0008)
2(0xbfc92788), 1(0xbfc9278c), 2(0xbfc9274c)
3(0x8cb0018), 1(0x8cb0008), 3(0x8cb0018)
1(0x8cb0018), 1(0x8cb0008), 1(0x8cb0018)
1(0x8cb0008), 1(0x8cb0008), 1(0x8cb0018)
1(0x8cb0008), 1(0x8cb0018), 1(0x8cb0018)