почему требуется принимать const_iterator а возвращать должны просто iterator в чем смысл?
почему нельзя было сделать параметр шаблонным мол пришел revers_iterator удалили и вернули следующий за ним такой же revers_iterator ну и так далее для всех возможных вариантов...
1. supapro 2. в стандарте не написано что там должно приниматься 3. у итератора не может быть метода erase
3. ну вы блин серьезно. ясный пень что есть контейнер.
а пишешь ты итератор
да. и написав метод erase для контейнера, получаю что мы не можем из конст_итератор который был на входе вернуть просто итератор ибо ошибка. и собственно вопрос, почему везде в STL: iterator erase(const_iterator pos)
А что не так? iterator может быть сконвертирован в const-версию
да, но нам то внутри функции нужно в обратную из const_iterator to iterator. октрыв исходники либы я вижу что внутри метода юзают закрытый метод _M_const_cast(). поэтому и возник вопрос, зачем мы сами рушим требования константности. когда в iterator to const_iterator ок. но в обратную сторону...
Формально говоря, константность итератора не обязана значить таковую для контейнера, так что иначе никак
да это понятно. я про другое. зачем было так делать в STL. причина историческая или есть нечто что я не понимаю. мы же могли просто написать: template <typename Iter> Iter erase(Iter pos) noexcept { destroy(pos); return ++pos; } Но методы для вектора, листа и т.п принимают конст_итератор и возвращают просто итератор.
И куча шаблонных трейтов как минимум
Есть и такое: delete (const char*)str; Я тоже вижу некоторое нарушение логики, но оно имеет смысл.
да смысл то что будет работать я не спорю. ясный пень что и тот и другой итератор указывают на одну и туже позицию константный он или нет.
тоесть для сокращения кода? хорошо где об этом можно почитать?
Боюсь, моё мнение тут скорее на уровне обывателя, чем разработчика Стандарта Можно спросить у @antoshkka Суть вопроса: почему erase в контейнерах принимают const_iterator и затем кастят const_cast'ом вместо, например, шаблонного Iter?
неконстантный должен уметь неявно преобразоввываться к константному А перегрузку не делают, чтобы меньше инстанцировалось шаблонов, и соответственно: * компилировалось быстрее * бинарники были меньшего размера
да из iterator to const_iterator это понятно. меня смутило из const в обычный. теперь понятно что для уменьшения кода, (хотя там кода 3 строки), и из-за этого как я понимаю erase не умеет в revers_iterator. наверное у себя напишу тупо через шаблонный параметр.
Обсуждают сегодня