为什么C ++ 17 destroy()/ destroy_n()函数向前运行(而不是向后运行)?

时间:2018-05-22 12:16:36

标签: c++ c++17

在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));
}

但是根据标准的要求,数组的破坏是reverse to the order of construction

那么destroy()destroy_n()的用例是什么?

是否有理由不与正常的阵列破坏保持一致,或者这是否是cppreference中的错误?

2 个答案:

答案 0 :(得分:8)

destroy() / destroy_n()是一致的 - 但是使用标准算法。它会给添加一个向后工作的算法带来很多不必要的混淆。除此之外,你总能做到:

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

在保持其余算法的样式和类型要求的同时,完全符合您的要求和期望。

关于标准还有一件事。它只表明C风格的数组以这种方式工作。 vectormap或任何其他stl容器没有任何内容。由于destroy函数可以采用任何C ++范围,因此它的行为与典型的C ++代码一样合理,而不是很久以前继承的语法的一部分。

答案 1 :(得分:3)

此函数需要前向迭代器,它只能向前移动。

似乎没有要求具体的销毁顺序。使用不同的执行策略,顺序可能不同。

如果你至少有双向迭代器,你可以在那里传递反向迭代器。