首页 > 解决方案 > 为什么 C++17 destroy()/destroy_n() 函数向前(而不是向后)运行?

问题描述

在 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()and的用例是destroy_n()什么?

是否有与正常数组破坏不一致的原因,或者这是 cppreference 中的错误?

标签: c++c++17

解决方案


destroy()/是一致的destroy_n()- 但与标准算法。添加一个向后工作的算法会带来很多不必要的混乱。除此之外,您始终可以执行以下操作:

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

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

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


推荐阅读