c++ - 有没有一种优雅的方式来交换 C++ 中的引用?

标签 c++ reference swap unions

有时类会引用其他类。为此类类实现 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;
}

使用 union 的简单解决方法:

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++ 编程语言” 书中,'reference' 被定义为一个 ,C++ 标准如何解释在一个 union 中混合引用和值'对象的替代名称,别名' (p.189)。

最佳答案

您使用的 union 技巧与代码一样不可移植。该标准对编译器如何实现引用没有任何要求。他们可以(并且很可能会)在后台使用指针,但这永远不能保证。更不用说 sizeof(size_t)sizeof(T*) 无论如何都不需要相等。

您的问题的最佳答案是:如果您需要可分配/可交换的类,请不要使用引用成员。只需使用指针成员即可。毕竟,根据定义,引用是不可重新安装的,但是通过希望类可交换,您需要一些可重新安装的东西。这是一个指针。

关于c++ - 有没有一种优雅的方式来交换 C++ 中的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25804844/

相关文章:

python - 使用函数交换索引切片

C++ 带有记录数组的交换函数

c++ - 为什么我不需要 3 级大括号来初始化 3 级数组?

c++ - MFC 一个父对话框,多个子对话框

c - C 中的求值顺序,通过使用在同一赋值中更改变量的函数来分配变量

c# - 比较两个集合值 c#

c# - 哪个更好,返回值或输出参数?

c++ - 用 constexpr 模拟 sizeof 的特殊属性

c++ - Qt:动画 QPixmap

struct - 如何交换结构的两个字段