[英]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.