Gibt es eine elegante Möglichkeit, Referenzen in C ++ auszutauschen?

Manchmal verweisen Klassen auf andere Klassen. Implementierung vonstd::swap() für solche Klassen kann nicht einfach sein, da dies zum Austauschen von Originalinstanzen anstelle von Referenzen führen würde. Der folgende Code veranschaulicht dieses Verhalten:

#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;
}

Eine einfache Problemumgehung mit einer Gewerkschaft:

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

Dies ist effektiv, aber nicht gut aussehend. Gibt es eine schönere Möglichkeit, zwei Referenzen in C ++ auszutauschen? Wie erklärt der C ++ - Standard das Mischen von Referenzen und Werten in einer Union, wenn man bedenkt, dass in Stroustrup's "Die C ++ - Programmiersprache" Buche ein'Referenz' ist definiert als ein 'alternativer Name eines Objekts, ein Alias' (S.189).

Antworten auf die Frage(4)

Ihre Antwort auf die Frage