fork download
  1. #include <iostream>
  2.  
  3. template <class T> void swap(T& a, T& b) {
  4. T tmp(std::move(a));
  5. std::cout << a->x << "(" << &a <<"), "; //note que aqui imprimo o endereço da variável que não varia
  6. std::cout << b->x << "(" << &b <<"), ";
  7. std::cout << tmp->x << "(" << &tmp <<")\n";
  8. tmp->foo(3); //só para mostrar que funciona e altera tanto a quanto tmp.
  9. std::cout << a->x << "(" << a <<"), "; //agora imprimo o valor dela que é o ponteiro e ele muda
  10. std::cout << b->x << "(" << b <<"), ";
  11. std::cout << tmp->x << "(" << tmp <<")\n";
  12. a->foo(1); //confirmando que são o mesmo endereço
  13. std::cout << a->x << "(" << a <<"), ";
  14. std::cout << b->x << "(" << b <<"), ";
  15. std::cout << tmp->x << "(" << tmp <<")\n";
  16. a = std::move(b);
  17. std::cout << a->x << "(" << a <<"), ";
  18. std::cout << b->x << "(" << b <<"), ";
  19. std::cout << tmp->x << "(" << tmp <<")\n";
  20. b = std::move(tmp);
  21. std::cout << a->x << "(" << a <<"), ";
  22. std::cout << b->x << "(" << b <<"), ";
  23. std::cout << tmp->x << "(" << tmp <<")\n";
  24. }
  25.  
  26. template <class T> void old_swap(T& a, T& b) {
  27. T tmp(a);
  28. std::cout << a->x << "(" << &a <<"), "; //note que aqui imprimo o endereço da variável que não varia
  29. std::cout << b->x << "(" << &b <<"), ";
  30. std::cout << tmp->x << "(" << &tmp <<")\n";
  31. tmp->foo(3); //só para mostrar que funciona e altera tanto a quanto tmp.
  32. std::cout << a->x << "(" << a <<"), "; //agora imprimo o valor dela que é o ponteiro e ele muda
  33. std::cout << b->x << "(" << b <<"), ";
  34. std::cout << tmp->x << "(" << tmp <<")\n";
  35. a->foo(1); //confirmando que são o mesmo endereço
  36. std::cout << a->x << "(" << a <<"), ";
  37. std::cout << b->x << "(" << b <<"), ";
  38. std::cout << tmp->x << "(" << tmp <<")\n";
  39. a = b;
  40. std::cout << a->x << "(" << a <<"), ";
  41. std::cout << b->x << "(" << b <<"), ";
  42. std::cout << tmp->x << "(" << tmp <<")\n";
  43. b = tmp;
  44. std::cout << a->x << "(" << a <<"), ";
  45. std::cout << b->x << "(" << b <<"), ";
  46. std::cout << tmp->x << "(" << tmp <<")\n";
  47. }
  48.  
  49. class teste {
  50. public:
  51. int x = 0;
  52. int foo(int x);
  53. };
  54.  
  55. int teste::foo(int x) {
  56. return this->x = x;
  57. }
  58.  
  59. int main() {
  60. teste* a = new teste();
  61. a->foo(1);
  62. teste* b = new teste();
  63. b->foo(2);
  64. swap(a, b);
  65. old_swap(a, b);
  66. return 0;
  67. }
  68.  
  69.  
Success #stdin #stdout 0s 3276KB
stdin
Standard input is empty
stdout
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)