Я практически новичок в языке программирования C++, так как программирую на нем один год. В настоящее время я начинаю личный проект, пытаясь реализовать некоторые части стандартной библиотеки ТОЛЬКО в учебных целях, и когда я не знаю, как что-то реализовать, я исследую репозитории MSVC, GCC и Clang на github.
В настоящее время я пытаюсь реализовать классы const_iterator и iterator и столкнулся с кодом, который плохо понимаю.
Ниже представлена реализация префиксного оператора ++, не имеющая параметров.
Код: Выделить всё
_CONSTEXPR17 _Array_const_iterator& operator++() noexcept {
++_Idx;
return *this;
}
Код: Выделить всё
_CONSTEXPR17 _Array_const_iterator operator++(int) noexcept {
_Array_const_iterator _Tmp = *this;
++*this;
return _Tmp;
}
Я полагаю, что это просто своего рода диспетчер тегов, сообщающий компилятору использовать rhs ценить. Но почему передается 'int' без имени параметра и почему вместо этого используется конкретный int, например, int32_t или другой для переносимости?
И на секунду вопрос. Когда я реализую класс iterator, который является производным от класса const_iterator, функция 'operator==' и их аналоги для сравнения (!=, = ) не реализованы, но все остальные функции перегрузки операторов реализованы.
Код: Выделить всё
_NODISCARD _CONSTEXPR17 bool operator==(const _Array_const_iterator& _Right) const noexcept {
return _Idx == _Right._Idx;
}
И GCC перегружает операторы сравнения по этой ссылке GCC stl следующим образом:
Код: Выделить всё
[[nodiscard]]
constexpr bool
operator==(const __normal_iterator& __lhs,
const __normal_iterator& __rhs)
noexcept(noexcept(__lhs.base() == __rhs.base()))
requires requires {
{ __lhs.base() == __rhs.base() } -> std::convertible_to;
}
{ return __lhs.base() == __rhs.base(); }
Моя текущая реализация const_iterator оператора==:
Код: Выделить всё
[[nodiscard]] constexpr bool operator==(const const_iterator& rhs) const noexcept
{
return (m_pointer == rhs.m_pointer);
}
Код: Выделить всё
[[nodiscard]] constexpr bool operator==(const iterator& rhs) const noexcept
{
return (m_pointer == rhs.m_pointer);
}
Источник: https://stackoverflow.com/questions/781 ... -correctly
Мобильная версия