有时,类正在引用其他类。为此类实现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++中的两个引用?考虑到在Stroustrup的“C++编程语言”书中,“引用”被定义为“对象的替代名称,别名”(第189页),因此C++标准如何解释在一个联合中混合使用引用和值。
最佳答案
您正在使用的联合技巧几乎与代码一样不可移植。该标准对编译器如何实现引用没有任何要求。他们可以(而且很可能确实可以)在内部使用指针,但这是无法保证的。更不用说sizeof(size_t)
和sizeof(T*)
并不需要相等了。
最好的答案是:如果需要可分配/可交换的类,请不要使用引用成员。只需使用指针成员即可。毕竟,根据定义,引用是不可重设的,但是希望通过类可交换,就可以重新定位。那是一个指针。