Почему нет std :: uninitialized_move_if_noexcept? - PullRequest
0 голосов
/ 23 октября 2018

C ++ 17 добавляет std::uninitialized_move, но нет std::uninitialized_move_if_noexcept, который бы использовал std::move_if_noexcept для внутреннего использования.На мой взгляд, это было бы полезно, так как теперь, если мы хотим перераспределить, нам все еще нужно написать что-то как

if constexpr (!std::is_nothrow_move_constructible_v<value_type>
              && std::is_copy_constructible_v<value_type>)
  std::uninitialized_copy(...);
else 
  std::uninitialized_move(...); 

. Есть ли какие-то конкретные причины, по которым std::uninitialized_move_if_noexcept не был введен в C ++?17?

1 Ответ

0 голосов
/ 23 октября 2018

В статье "Расширяющиеся инструменты управления памятью" на open-std.org есть раздел на uninitialized_move, посвященный этому вопросу.

Определенная обеспокоенность вызывает обработка исключений в отношении uninitialized_move.Если бросает конструктор перемещения, исходный объект мог быть непоправимо поврежден.Поскольку решения этой проблемы не существует, мы реализуем естественную и ожидаемую семантику уничтожения всех полностью построенных объектов в целевом буфере и распространения исключения.Это соответствует поведению uninitialized_copy настолько близко, насколько это возможно. Дополнительный алгоритм uninitialized_move_if_noexcept может рассматриваться как решение этой проблемы .Такой алгоритм был найден уже реализованным в libstdc ++ с использованием итератора move_if_noexcept. Учитывая, что в настоящее время нет алгоритма move_if_noexcept на основе диапазона, такое решение здесь не рассматривается .Однако очевидно, что такая возможность вполне возможна.

...