¿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).