Ваш вопрос тогда сводится к вопросу о гарантиях исключения. Существует 3 типа гарантий исключений (которые применяются к функциям):
- Никаких исключительных гарантий вообще (на самом деле это не тип ... но это может произойти, если этот вопрос не проявляется)
- Базовая гарантия исключений : технически правильная, но не функционально правильная (т. Е. Нет утечки ресурса, программа завершается без резкой остановки, но может иметь нежелательные побочные эффекты, такие как обналичивание платежа) -в, но команда не регистрируется)
- Сильная гарантия исключения : Все или ничего (например, транзакция), то есть либо все сделано правильно, либо мы возвращаемся к предыдущему состоянию.
- Гарантия исключения без броска : Это не бросает, так что не беспокойтесь.
Когда вы составляете свою функцию, вы обычно выбираете существующие функции со своими собственными гарантиями. Сложно увеличить гарантию исключения, т. Е. Обычно вы ограничены самой слабой гарантией.
W.r.t ваш вопрос, требуется, по крайней мере, Сильная гарантия исключения , если исходный объект остается нетронутым, если выдается исключение.
Итак, что произойдет, если во время построения движения будет сгенерировано исключение? Это зависит от гарантий, предоставленных подобъектами, и способа объединения вызовов ...
- Если из конструктора выдается исключение, объект не создается, а все созданные подобъекты уничтожаются в обратном порядке. Это правило также применимо к движению-конструктору
- Если вы не «обернете» конструктор в попытку, и каким-то образом восстановите объекты, которые были перемещены, они потеряют свои ресурсы. Обратите внимание, что они все равно должны находиться в разрушаемом состоянии, поэтому технически программа будет правильной.
С точки зрения гарантий исключений это означает, что по умолчанию, если все конструкторы подобъектов хотя бы соответствуют Базовой гарантии исключений , тогда ваш конструктор перемещения тоже будет без особой заботы.
Однако, даже если все конструкторы подобъектов соответствуют Сильному исключению , маловероятно, что ваш собственный конструктор перемещения встретит его: это та же проблема, что цепочка транзакций не дает транзакция.
Если может сгенерировать только один из конструкторов подобъектов, и он отвечает Сильному исключению , то ваш конструктор перемещения естественным образом встретит его сам, если вы сначала инициализируете бросающий объект.
Надеюсь, это помогло ... исключения - это дикий зверь, который можно приручить:)