簡體   English   中英

operator->() 是否保證可用於標准 C++ 容器的迭代器?

[英]Is operator->() guaranteed to be available for a standard C++ container's iterator?

#include <map>

int main()
{
    auto coll = std::map<int, int>{{1, 2}};
    auto pos  = coll.begin();

    (*pos).first;   // OK. Conforming to the C++ standard.
    pos->first;     // Does this conform to the C++ standard too?
}

根據cppref ,迭代器 object pos必須保證*pos++pos是有效的表達式。 但是,C++ 標准不要求 pos- pos->first也必須是有效表達式。

operator->()是否保證可用於標准 C++ 容器的迭代器?

C++17 命名的InputIterator迭代器要求,因此所有派生都要求迭代器提供operator-> 但是,C++20 迭代器概念沒有。 特定的實現可以提供它們,標准庫容器遵循 C++17 要求和 C++20 概念的規則。

因此,如果您有一個模板 function 將自身限制為 C++20 迭代器/范圍概念,則不允許使用-> 當然,如果您使用的是非模板代碼,並且您知道您得到了哪些類型,那么您可以使用您可用的完整界面。

請注意,C++17 的 OutputIterator 要求包括-> 因此,任何純 OutputIterators 的標准庫迭代器(例如ostream_iterator )不一定提供它。

如果標准說 iterator_traits::pointer 和 iterator_traits::reference 是非 void 類型,那么標准保證迭代器必須有一個 operator->

23.3.2.3 迭代器特征[iterator.traits] 1 為了僅根據迭代器實現算法,有時需要確定對應於特定迭代器類型的迭代器類別。 因此,如果 I 是迭代器的類型,則需要將類型 iterator_traits::iterator_category 定義為迭代器的迭代器類別。 此外,類型iterator_traits::pointer iterator_traits::reference 應定義為迭代器的指針和引用類型; 也就是說,對於 class 類型的迭代器 object a,分別與 decltype(a.operator->()) 和 decltype(*a) 類型相同。 對於不支持 operator-> 的 class 類型 I 的迭代器,類型 iterator_-traits::pointer 應為無效。 此外,對於 output 迭代器,類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM