Есть ли элегантный способ обмена ссылками в 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).