在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中的错误?
答案 0 :(得分:8)
destroy()
/ destroy_n()
是一致的 - 但是使用标准算法。它会给添加一个向后工作的算法带来很多不必要的混淆。除此之外,你总能做到:
destroy(std::rbegin(array), std::rend(array));
在保持其余算法的样式和类型要求的同时,完全符合您的要求和期望。
关于标准还有一件事。它只表明C风格的数组以这种方式工作。 vector
,map
或任何其他stl容器没有任何内容。由于destroy
函数可以采用任何C ++范围,因此它的行为与典型的C ++代码一样合理,而不是很久以前继承的语法的一部分。
答案 1 :(得分:3)
此函数需要前向迭代器,它只能向前移动。
似乎没有要求具体的销毁顺序。使用不同的执行策略,顺序可能不同。
如果你至少有双向迭代器,你可以在那里传递反向迭代器。