通过引用传递的参数无法维护常量的正确性

Having trouble maintaining const correctness with parameter passed by reference

本文关键字:维护 常量 正确性 参数 引用      更新时间:2023-10-16

我肯定以前有人问过这个问题,但所有搜索结果都有const&问题。

我想确保下面的方法不会改变传递给它的GuestNode,所以我想传递const GuestNode& guest,但g++不会让这种情况发生,因为我将&guest分配给指针。为什么会发生这种情况?如何确保传递的参数保持原样?

   void GuestList::Add(GuestNode& guest)
   {
      if ( first == 0 )
      {
         //first guest
         first = &guest;
      }
      else
      {
         //nth guest
         GuestNode *p = first;
         while ( p->next != 0 )
            p = p->next;
         p->next = &guest;
      }
      SetCount(GetCount() + 1);
   }

如果将guest设为const GuestNode&,则&guestconst GuestNode*。也就是说,它是指向const GuestNode的指针。这是有道理的,否则你可以通过指向const对象的非const指针来修改它。因此,如果你要将该指针分配给first和/或p,你需要确保它们也是const GuestNode*

如果您需要first(我假设它是GuestList的成员(是非const,那么您不应该使用const引用。

演示:

const int x = 5;
int* p = &x; // error: invalid conversion from ‘const int*’ to ‘int*’

想象一下,如果这不是一个错误,那么我就可以执行*p = 10;来更改x的值,即使对象应该是const