Пункт 23.2.1.10 стандарта C ++ 11 гласит, что
«нет копии ctor возвращаемого итератора выдает исключение»
Означает ли это в основном, что возможно, чтобы копирующий ctor итератора не выбрасывал даже предположительно bad_alloc (оставляя случай, когда итератор мог быть просто указателем, а здесь нет проблем), потому что он будет использовать информацию, уже созданную в возвращаемом « итератора «? потому что он передается по значению, будет ли стек выделен в вызываемой функции, следовательно, может гарантия нет проблем с памятью?
В этом параграфе говорится об итераторах, используемых контейнерами в стандартной библиотеке. Известно, что эти итераторы могут быть реализованы таким образом, чтобы они не генерировали исключение при копировании. Например, ни один из них не должен использовать динамически распределенную память.
Гарантия распространяется только на эти итераторы, а не на итераторы в целом (хотя следует следовать примеру).
Юридический ответ: нет. Это просто твоя интерпретация. Это технически правильно, но это может быть не единственное и технически правильное толкование.
Технический ответ: в данном случае важно избегать того, чтобы исключение, генерируемое изменяющимся итератором (например, для вставки или для выходного итератора), приводило к отказу алгоритма при переходе контейнера в неопределенное и несовместимое состояние (например, подумайте , к связанному списку со ссылками, еще не полностью связанными)
Дело не только в bad_alloc для итераторов, которые имеют динамически распределенное состояние, но также и для итератора, который — во время своей собственной копии — пытается изменить упомянутый элемент, который не может быть выполнен в этом (например, из-за того, что присваивается присвоение элемента).
Когда происходит такой случай, итератор не обязан «завершать алгоритм» (это было бы невозможно), но должен оставлять контейнер в согласованном и все еще управляемом состоянии.
Я думаю, что есть неверное толкование о том, что конструктор копирования средства.
Конструктор копирования не отвечает за выделение памяти, в которой будет построен сам объект, это обеспечивается извне вызывающей стороной.
Следовательно, требуется, чтобы тело конструктора копии (будь то написано или сгенерировано) не выбрасывает. В C ++ известно, что встроенные типы (int
, T*
, …) можно копировать без выброса, и оттуда можно создавать типы, которые, таким образом, можно копировать без выброса исключений (если избегать динамического выделения ресурсов и / или ввода-вывода, это происходит автоматически).