C++ 指针解引用运算符`->;的语义`

C++ 指针解引用运算符`->;的语义`,c++,C++,我正在寻找有关指针解引用操作符的帮助。让我描述一下我想做什么 我正在为一个特殊容器实现一个单向迭代器。容器的特殊之处在于它不为包含的值分配任何物理空间,而是在运行时根据需要生成它们。例如,考虑容器是“ m连续整数倍的n > 因为我不想将值直接存储在迭代器中,所以我会根据需要在堆上创建一个值 当我需要一个指向该值的指针时,如果旧指针过期,我会删除它并创建一个新指针。这意味着调用运算符*()或运算符->()可以删除旧值和新新值,如果迭代器在上次调用后已使用运算符++()进行了升级 现在,我想使用智

我正在寻找有关指针解引用操作符的帮助。让我描述一下我想做什么

我正在为一个特殊容器实现一个单向迭代器。容器的特殊之处在于它不为包含的值分配任何物理空间,而是在运行时根据需要生成它们。例如,考虑容器是“<强> m连续整数倍的n<强> >

因为我不想将值直接存储在迭代器中,所以我会根据需要在堆上创建一个值

当我需要一个指向该值的指针时,如果旧指针过期,我会删除它并创建一个新指针。这意味着调用
运算符*()
运算符->()
可以
删除
旧值和
新值,如果迭代器在上次调用后已使用
运算符++()
进行了升级

现在,我想使用
智能ptr
指向我的值,而不是保留本地指针。为此,我意识到我需要更好地理解
->
操作符的语义

  • 首先,
    ->
    是一元运算符吗
  • 如果是这样的话,
    i->member
    是如何工作的。这将转换为
    (指针返回)成员
    ,它不是语法上有效的形式
  • “成员”可以是数据成员或成员函数
  • ->()
    闻起来更像是执行
    (*指针返回)的二进制运算符。成员
    。由于“member”不是一个值,这样的语义也不等同于二进制运算符
  • ->()
    返回的指针会发生什么变化?谁应该拥有它
  • 如何在此框架中使用RAAI?引用计数指针是唯一的选项吗
  • 此迭代器没有
    --
    运算符,因此我不需要保留以前的值

谢谢你的回复。最后是一个元问题,这应该是一个wiki吗?

以下是回答您的问题的答案,尽管我认为它们并不像您希望的那样有用:

  • 是的,它是一元运算符
  • 不,它不关心成员是什么。如果
    member
    不是指向
    operator->
    返回的类/结构的字段/成员,则编译器将投诉
  • member
    实际上可以是数据成员或成员函数
  • 不,它是一元运算符,因为它对
    成员
    不做任何操作。它只是为了实现智能指针。说
    return\u type*ptr=smarptr.operator->()
    完全正确
  • 它归归还它的人所有。但这完全是按照惯例。你可以决定你想要什么。但是,如果您决定了除此之外的任何事情,这会让很多人感到惊讶,他们会认为他们的程序中有一个bug,并且永远不会想知道您的智能指针实现是否有其他人不使用的奇怪语义
  • 如果你使用
    操作符->
    来实现智能指针之外的任何东西,我无意帮助你编写代码,程序员会在你之后辱骂和取笑你
  • 这是一个声明,不是一个问题,所以我没有答案。:-)
我怀疑你是否愿意指出自己的价值。在我看来,您可以通过值将其作为迭代器的成员值来保存,下面我将给出一个示例,说明这是如何工作的。但是,如果您设置使用指向您的值的指针,并且希望使用智能指针,只需为您自己的
operator->()返回
smartptr.operator->()的结果即可。您还可以使用智能指针(通常是
get
)的成员函数,该函数返回一个“裸”指针,这可能会让人们少一点困惑

以下是示例容器应如何工作的示例:

class multiples {
  public:
   multiples(int n, int starting_multiplier, int ending_multiplier)
      : n_(n), starting_(starting_multiplier), ending_(ending_multiplier)
   {
   }

   class const_iterator {
      friend class multiples;
     public:
      const int &operator *() const { return curval_; }
      const int *operator ->() const { return &curval_; }

      const const_iterator &operator ++() { curval_ += n_; return *this; }
      const const_iterator operator ++(int) {
         const_iterator tmp(*this);
         curval += n_;
         return tmp;
      }

      bool operator ==(const const_iterator &b) const { return curval_ == b.curval_; }
      bool operator !=(const const_iterator &b) const { return curval_ != b.curval_; }

     protected:
      explicit const_iterator(int n, int starting) : n_(n), curval_(starting * n) {}

     private:
      const int n_;
      int curval_;
   };

   const_iterator begin() const { return const_iterator(n_, starting_); }
   const_iterator end() const { return const_iterator(n_, ending_); }

  private:
   const int n_, starting_, ending_;
};

以下是回答您的问题的答案,尽管我认为这些问题没有您希望的那么有用:

  • 是的,它是一元运算符
  • 不,它不关心成员是什么。如果
    member
    不是指向
    operator->
    返回的类/结构的字段/成员,则编译器将投诉
  • member
    实际上可以是数据成员或成员函数
  • 不,它是一元运算符,因为它对
    成员
    不做任何操作。它只是为了实现智能指针。说
    return\u type*ptr=smarptr.operator->()
    完全正确
  • 它归归还它的人所有。但这完全是按照惯例。你可以决定你想要什么。但是,如果您决定了除此之外的任何事情,这会让很多人感到惊讶,他们会认为他们的程序中有一个bug,并且永远不会想知道您的智能指针实现是否有其他人不使用的奇怪语义
  • 如果你使用
    操作符->
    来实现智能指针之外的任何东西,我无意帮助你编写代码,程序员会在你之后辱骂和取笑你
  • 这是一个声明,不是一个问题,所以我没有答案。:-)
我怀疑你是否愿意指出自己的价值。在我看来,您可以通过值将其作为迭代器的成员值来保存,下面我将给出一个示例,说明这是如何工作的。但是,如果您设置使用指向您的值的指针,并且希望使用智能指针,只需为您自己的
operator->()返回
smartptr.operator->()的结果即可。您也可以使用memb