почему в C ++ 17 функции destroy () / destroy_n () выполняются вперед (а не назад)? - PullRequest
0 голосов
/ 22 мая 2018

В C ++ 17 destroy() и destroy_n() запускают деструктор ряда объектов.

Однако, согласно cppreference , это делается в прямом направлении, то есть

template< class ForwardIt >
void destroy( ForwardIt first, ForwardIt last )
{
  for (; first != last; ++first)
    std::destroy_at(std::addressof(*first));
}

Но уничтожение массива в обратном порядке в соответствии с требованиями стандарта.

Так, каков будет сценарий использования destroy() и destroy_n()?

Есть ли причина для несоответствия нормальному уничтожению массива, или это ошибка в cppreference?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

destroy() / destroy_n() соответствует - но со стандартными алгоритмами.Это добавило бы много ненужной путаницы, чтобы добавить единственный алгоритм, который работает в обратном направлении.Кроме того, вы всегда можете сделать:

destroy(std::rbegin(array), std::rend(array));

, которая делает именно то, что вы хотите и ожидаете, сохраняя требования к стилю и типу остальных алгоритмов.

Еще одна вещь, касающаясястандарт.Это только заявляет, что массив стиля C работает таким образом.Нет ничего о vector, map или любом другом контейнере stl.Поскольку destroy функция может принимать любой диапазон C ++, разумно, что она ведет себя как типичный код C ++, а не как часть синтаксиса, унаследованного довольно давно.

0 голосов
/ 22 мая 2018

Для этой функции требуется прямой итератор, который можно перемещать только вперед.

Кажется, что нет требования для определенного порядка уничтожения.При разных политиках выполнения порядок может быть другим.

Вы можете передавать туда итераторы, если у вас есть хотя бы двунаправленные итераторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...