簡體   English   中英

為什么我的迭代器不是 std::input_iterator?

[英]Why is my iterator not std::input_iterator?

為什么下面的迭代器不滿足std::input_iterator概念? 我錯過了什么?

template <class T>
struct IteratorSentinel {};

template <class T>
class Iterator
{
public:

    using iterator_category = std::input_iterator_tag;

    using value_type = T;

    using difference_type = std::ptrdiff_t;

    using pointer = value_type*;

    using reference = value_type&;

    Iterator() = default;
    
    Iterator(const Iterator&) = delete;

    Iterator& operator = (const Iterator&) = delete;

    Iterator(Iterator&& other) = default;

    Iterator& operator = (Iterator&& other) = default;

    T* operator-> ();

    T& operator* ();

    bool operator== (const IteratorSentinel<T>&) const noexcept;

    Iterator& operator++ ();

    void operator++ (int);
};

以下 static 斷言失敗:

static_assert(std::input_iterator<Iterator<int>>);

而且,例如,下面的代碼無法編譯:

template <class T>
auto make_range()
{
    return std::ranges::subrange(Iterator<T>(), IteratorSentinel<T>{});
}

std::ranges::equal(make_range<int>(), std::vector<int>());

您的operator*不是const合格的。

std::input_iterator概念(通過std::indirectly_readable概念)要求*可以應用於const和非const左值以及類型的右值,並且在所有情況下都返回相同的類型。

暫無
暫無

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

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