Допустим, вы делаете то, что делает vector
, когда будет использоваться move_if_noexcept
. То есть у вас есть какой-то объект obj
, и вам нужно создать новое значение этого типа из obj
. И после этого вы собираетесь удалить obj
. Это лучший случай для перемещения объекта, поэтому vector
делает это там, где это возможно.
Если движение noexcept
, то перемещение obj
по определению безопасно. Если это не noexcept
, то вам нужно спросить: что произойдет, если сработает конструктор перемещения? Каково состояние obj
в этом случае? Ответ ... ты не знаешь. Хуже того, как насчет состояния каких-либо объектов, с которых вы уже успешно переехали? Вы можете переместить их назад ?
Однако, когда дело доходит до копирования конструкторов, вы знаете . Конструктор копирования принимает const&
к исходному объекту. Таким образом, по определению, неудачная операция копирования не может изменить obj
(и да, мы знаем, что вы можете const_cast
, но это делает ваш конструктор копирования ложью . почему auto_ptr
больше не существует, и я бы предположил, что в стандарте есть общий запрет на конструкторы ложных копий). Таким образом, в случае неудачной копии obj
находится в исходном состоянии.
Поэтому, если движение может вызвать бросок, копирование предпочтительнее, поскольку это обеспечивает надежную гарантию исключения: в случае исключения все возвращается к тому, что было.
Однако, если ваш единственный вариант - ход броска, у вас есть два варианта: сделать так, чтобы такой тип не мог когда-либо использоваться с vector
, или предложить любое исключение, гарантирующее сам тип предложения по сбою движения. И последнее - это то, что выбрано.
Это разрешено, потому что это то, что вы просили . Выбранный вами тип не предусматривает строгой гарантии исключения, поэтому он не может быть предоставлен. Но вы все равно можете сделать vector
таких типов; вам просто нужно иметь дело с возможностью не копируемого сбоя движения.
И поскольку вы тот тип людей, который использует типы, которые не могут предоставить строгой гарантии исключений, вы, несомненно, должны знать, как обращаться с этими сценариями, верно?