Есть ли элегантный способ обмена ссылками в C ++?

Иногда классы ссылаются на другие классы. Внедрениеstd::swap() для таких классов не может быть простым, потому что это привело бы к замене оригинальных экземпляров вместо ссылок. Код ниже иллюстрирует это поведение:

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

Простой обходной путь с объединением:

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

Это эффективно, но не красиво. Есть ли лучший способ поменять две ссылки в C ++? Также, как стандарт C ++ объясняет смешивание ссылок и значений в одном объединении, учитывая, что в Страуструпе«Язык программирования C ++» зарезервировать'ссылка' определяется как«альтернативное имя объекта, псевдоним» (С.189).

Ответы на вопрос(4)

Ваш ответ на вопрос