Как работает перегрузка операторов в итераторах C++ STL и ее следует правильно реализовать? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Как работает перегрузка операторов в итераторах C++ STL и ее следует правильно реализовать? [дубликат]

Сообщение Гость »


Я практически новичок в языке программирования C++, так как программирую на нем один год. В настоящее время я начинаю личный проект, пытаясь реализовать некоторые части стандартной библиотеки ТОЛЬКО в учебных целях, и когда я не знаю, как что-то реализовать, я исследую репозитории MSVC, GCC и Clang на github.
В настоящее время я пытаюсь реализовать классы const_iterator и iterator и столкнулся с кодом, который плохо понимаю.
Ниже представлена ​​реализация префиксного оператора ++, не имеющая параметров.

Код: Выделить всё

_CONSTEXPR17 _Array_const_iterator& operator++() noexcept {
++_Idx;
return *this;
}
В приведенной ниже функции, то есть для постфиксного оператора, она передает тип int без имени параметра...

Код: Выделить всё

_CONSTEXPR17 _Array_const_iterator operator++(int) noexcept {
_Array_const_iterator _Tmp = *this;
++*this;
return _Tmp;
}
Оба предыдущих для класса const_iterator.
Я полагаю, что это просто своего рода диспетчер тегов, сообщающий компилятору использовать rhs ценить. Но почему передается 'int' без имени параметра и почему вместо этого используется конкретный int, например, int32_t или другой для переносимости?
И на секунду вопрос. Когда я реализую класс iterator, который является производным от класса const_iterator, функция 'operator==' и их аналоги для сравнения (!=, = ) не реализованы, но все остальные функции перегрузки операторов реализованы.

Код: Выделить всё

_NODISCARD _CONSTEXPR17 bool operator==(const _Array_const_iterator& _Right) const noexcept {
return _Idx == _Right._Idx;
}
Все предыдущие фрагменты кода взяты из MSVC stl, MSVC stl. Почему не реализуются? И как мне это реализовать?
И 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);
}
Hoping I was clear enough and thank you in advance.


Источник: https://stackoverflow.com/questions/781 ... -correctly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»