【问题标题】:Why does std::vector::iterator::operator-> only drill down one level?为什么 std::vector::iterator::operator-> 只向下钻取一层?
【发布时间】:2020-02-24 17:23:27
【问题描述】:

这段代码编译失败:

void foo(vector<unique_ptr<pair<int, int>>> bar)
{
    bar.begin()->first;
}

这里有什么问题? operator-&gt; 不应该向下钻取到 pair 吗?

【问题讨论】:

  • "不应该将operator-&gt; 向下钻取到pair" 不,为什么应该这样做?它返回底层元素,即unique_ptr&lt;pair&lt;int, int&gt;&gt;
  • 它有自己的operator-&gt;,所以通常C++调用它(通常称为operator-&gt;的向下钻取行为。
  • 仅仅因为一个类有一个operator-&gt; 并不意味着它应该被自动调用。编译器如何知道何时调用它与何时不调用它?编译器如何知道您想要其中的pair,而不是unique_ptr
  • 你试过 bar[0]->first 吗?
  • @HazemAbaza 当然我知道我可以只是取消引用迭代器并继续,但令人惊讶的是,我认为operator-&gt; 一直在继续,直到它遇到一个没有'没有。

标签: c++ iterator operator-overloading drilldown


【解决方案1】:

不应该operator-&gt; 向下钻取直到pair

operator -&gt; 的递归仅在您获得指针类型之前有效。一旦发生这种情况,递归就会停止,您可以访问该指针指向的内容。在这种情况下,std::vector::iterator::operator-&gt; 返回 unique_ptr&lt;pair&lt;int, int&gt;&gt;* 作为向量中元素的指针类型。一旦你点击了那个指针,你就可以访问unique_ptr的成员,而不是它指向的pair&lt;int, int&gt;

你可以得到你想要的东西

(*bar.begin())->first;

所以现在你使用的是operator-&gt; of unique_ptr&lt;pair&lt;int, int&gt;&gt;

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 2015-12-15
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多