有时,类正在引用其他类。为此类实现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*)并不需要相等了。

最好的答案是:如果需要可分配/可交换的类,请不要使用引用成员。只需使用指针成员即可。毕竟,根据定义,引用是不可重设的,但是希望通过类可交换,就可以重新定位。那是一个指针。

10-07 12:55
查看更多