Надеюсь, что это помогло ... исключения дикий зверь, чтобы приручить :)

роизойдет в следующем стандарте C ++ 0x, когда в конструкторе перемещения будет возникать исключение?

Останется ли оригинальный объект? или оба объекта находятся в неопределенном состоянии? Какие гарантии дает язык?

 Matthieu N.19 янв. 2011 г., 06:43
Итак, вы говорите, что не должно быть никакого исключения, потому что состояние копируемых элементов никогда не изменяется во время операции перемещения?
 templatetypedef19 янв. 2011 г., 06:47
Сорта - это похоже на индуктивный аргумент, который вы используете, чтобы доказать, чтоswap не могу бросить. В качестве базового случая переназначение и копирование примитивов никогда не генерируются. В качестве индуктивного шага конструктор перемещения для объекта с некоторыми элементами данных может перемещать эти элементы данных без выброса (индуктивная гипотеза!) И, следовательно, может перемещаться сам без выброса. Самостоятельно, однако, я все еще хочу знать, каков правильный ответ на ваш вопрос.
 templatetypedef19 янв. 2011 г., 06:40
Мне интересно, если это как деструктор, где это просто плохо, если он выдает исключение. Я бы предположил, что в большинстве случаев вы можете двигаться, не делая ничего, что могло бы бросить, поскольку вы (обычно) просто перемещаете указатели ...

Ответы на вопрос(3)

3 типа гарантий исключений (которые применяются к функциям):

Нет никаких исключений гарантии (на самом деле не тип ... но это может произойти, если не уделять внимания этому вопросу)Основная гарантия исключения: Технически корректно, но не функционально правильно (т. Е. Нет утечки ресурсов, программа завершится без резкой остановки, но у нее могут быть нежелательные побочные эффекты, такие как выплата наличных денег, но команда не зарегистрирована)Сильная гарантия исключения: Все или ничего (например, транзакция), то есть либо все сделано правильно, либо мы возвращаемся к предыдущему состоянию.Гарантия исключения без броскаЭто не бросать, никогда, так что не волнуйтесь.

Когда вы составляете свою функцию, вы обычно выбираете существующие функции со своими собственными гарантиями. Сложно увеличить гарантию исключения, т. Е. Вы обычно ограничены самой слабой гарантией.

W.r.t ваш вопрос, требуется по крайней мереСильная гарантия исключения чтобы оригинальный объект оставался нетронутым, если выдается исключение.

Итак, что произойдет, если во время построения движения будет сгенерировано исключение? Это зависит от гарантий, предоставляемых подобъектами, и способа, которым вы объединили звонки ...

Если исключение выдается из конструктора, объект не создается, а все созданные подобъекты уничтожаются в обратном порядке. Это правило также применимо к движению-конструкторуЕсли вы не «обернете» конструктор попыткой перехвата и каким-то образом восстановите объекты, которые были перемещены, они потеряют свои ресурсы. Обратите внимание, что они все равно должны быть в разрушаемом состоянии, так что технически программа будет правильной.

С точки зрения гарантий исключений это означает, что по умолчанию, если все конструкторы подобъектов хотя бы соответствуютОсновная гарантия исключения, то ваш конструктор ходов тоже будет, без особой заботы.

Однако, даже если все конструкторы подобъектов удовлетворяютСильная гарантия исключенияМаловероятно, что вам удастся встретить свой собственный конструктор перемещения: это та же проблема, что цепочка транзакций не приводит к транзакции.

Если только один из конструкторов подобъектов может бросить, и он встречаетСильная гарантия исключения, тогда ваш конструктор перемещения естественно встретит его сам, если вы сначала инициализируете бросающий объект.

Надеюсь, что это помогло ... исключения дикий зверь, чтобы приручить :)

что комитет по стандартам изначально пытался сделать так, чтобы конструкторам перемещения не разрешалось выдавать исключения, но (по крайней мере, на сегодняшний день) обнаружилось, что при попытке применить это слишком много подводных камней.

Предложение N3050, «Позволять перемещать конструкторы, бросать (Rev 1)», было включено в проект стандарта. По сути, в предложении добавлена ​​возможность бросать конструкторы перемещения, но запрещены «бросающие» ходы, которые будут использоваться для определенных операций, где требовались строгие гарантии безопасности исключений (библиотека вернется к копированию объекта, если не выбрасывающий ход не существует). т в наличии).

Если вы пометите конструктор перемещения как не бросающий (noexcept) и генерируется исключение, вызывается std :: terminate ().

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3050.html

Возможно, стоит прочитать статью Дэвида Абрахамса в блоге, в которой обсуждаются проблемы, которые N3050 должен был решить:

http://cpp-next.com/archive/2009/10/exceptionally-moving/
 Matthieu M.19 янв. 2011 г., 08:48
Спасибо за статью Дэвида Абрахамса :)
 Matthieu N.19 янв. 2011 г., 09:21
Да, я тоже нашел целый блог cpp-next довольно интересными кучами полезных статей!

можно явно выбрасывать исключение из ctor-перемещения, но также неявно вызывать ctor-копию для подобъекта из ctor-перемещения. Этот экземпляр ctor может делать что-то, что может выдать, например выделять память. Таким образом, для исходного объекта минимальной гарантией является то, что первоначальное значение может сохраняться или не сохраняться, но оно все равно должно находиться в состоянии разрушения.

Для объекта, к которому выполняется перемещение, это то же самое, что и бросание из ctor в текущем C ++: уничтожить все созданные базы и члены, выполнить обработчик попытки функции ctor, если таковой имеется, затем распространить исключение. Подробности в N3225 §15.2p2.

В частности, обратите внимание, что контейнеры требуют, чтобы их типы распределителя не имели бросающих движущихся ктор:

Такая конструкция перемещения распределителя не должна выходить через исключение. [N3225 §23.2p8]

Это позволяет контейнерам перемещать распределители и использовать эти распределители для очистки своих элементов в случае исключения при перемещении или копировании элементов.

Ваш ответ на вопрос