Контейнеры стандартной библиотеки позволяют нам erase
использовать диапазоны, обозначенные итераторами first
и last
.
std::vector<foo> bar;
// first it last it
bar.erase(bar.begin(), bar.end());
Стандарт говорит, что итератор first
должен быть действительным и разыменовываемым, тогда как last
должен быть только действительным. Однако, если first == last
, то first
не нужно разыменовывать, потому что erase
не является операцией. Это означает, что следующее является законным:
bar.erase(bar.end(), bar.end());
Однако, если я хочу стереть только один элемент, а не диапазон, итератор должен быть действительным и разыменовываемым, что приводит к следующему неопределенному поведению:
bar.erase(bar.end());
Почему это не просто бездействие? Является ли это недосмотром комитета по стандартам, который будет устранен в будущем пересмотре языка, или это преднамеренное дизайнерское решение, в котором я не вижу смысла?
Насколько я вижу, это не дает никаких преимуществ, но создает дополнительные головные боли при выполнении чего-то вроде следующего:
bar.erase(std::find(bar.begin(), bar.end(), thing));