¿Hay alguna forma elegante de intercambiar referencias en C ++?

A veces las clases hacen referencia a otras clases. Implementarstd::swap() para tales clases no puede ser sencillo, ya que conduciría al intercambio de instancias originales en lugar de referencias. El siguiente código ilustra este comportamiento:

#include <iostream>

class A
{
   int& r_;
public:
   A(int& v) : r_(v) {}
   void swap(A& a)
   {
      std::swap(r_, a.r_);
   }
};

void test()
{
   int x = 10;
   int y = 20;

   A a(x), b(y);
   a.swap(b);

   std::cout << "x=" << x << "\n"
             << "y=" << y << "\n";
}

int main()
{
    test();
    return 0;
}

Una solución simple con una unión:

class A
{
   union
   {
      int& r_;
      size_t t_;
   };
public:
   A(int& v) : r_(v) {}
   void swap(A& a)
   {
      std::swap(t_, a.t_);
   }
};

Esto es efectivo, pero no atractivo. ¿Hay una mejor manera de intercambiar dos referencias en C ++? Además, ¿cómo explica el estándar C ++ la mezcla de referencias y valores en una unión, teniendo en cuenta que en Stroustrup"El lenguaje de programación C ++" reservar'referencia' se define como un'nombre alternativo de un objeto, un alias' (p.189).

Respuestas a la pregunta(4)

Su respuesta a la pregunta