【问题标题】:Why does the iterator of List in STL use the (*node).data instead of node->data?为什么STL中List的迭代器使用(*node).data而不是node->data?
【发布时间】:2014-01-10 21:44:03
【问题描述】:

我最近查看了 SGI STL 的源代码。我想知道是否可以用“->”运算符代替(*node).data来实现operator*(),像这样:

reference operator*() const {return (*node).data;}

替换为:

reference operator*() const {return node->data;}

另外:

node 是一个指向结构对象的指针,如下所示:

template<class T>
struct __list_node {
    typedef void * void_pointer;
    void_pointer prev;
    void_pointer next;
    T data;
};

【问题讨论】:

  • 可以,但有什么意义呢?
  • 可能,是的。 node 是什么类型,它是重载 operator-&gt; 还是一元 operator*
  • node 是一个指向 struct __list_node {} 的指针
  • @herohuyongtao 他们通常应该是,但没有强制执行。就像++aa++ 可能会以不同的方式影响a - 或者就像c &lt;&lt; n 可能有副作用并且意味着与按位移位不同的东西,命名为流行的早期重载更改运算符意思。

标签: c++ stl operator-overloading


【解决方案1】:

在大多数情况下(例如,当node 是指针时),它们是等价的。 x-&gt;y 运算符定义为等效于(*(x)).y。但是,operator*operator-&gt; 可能会过载,在这种情况下,它们的行为可能与您预期的不同(但它们应该)。

正如你所说,在这种情况下,node 只是一个指针,所以它们是等价的。

【讨论】:

  • "在这种情况下,它们的行为可能与您预期的不同" -- 但如果它们没有,请停止使用该库。作者是个坏人。
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2015-09-09
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2011-10-04
相关资源
最近更新 更多