Иногда классы ссылаются на другие классы. Реализация 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_);
}
};
Это эффективный, но не красивый. Есть ли лучший способ заменить две ссылки на С++? Кроме того, как стандарт С++ объясняет смешение ссылок и значений в одном объединении, учитывая, что в книге Stroustrup "Язык программирования С++" "ссылка" определяется как "альтернативное имя объекта, псевдоним" (стр .189).