- memory[meta header]
- std[meta namespace]
- function template[meta id-type]
- cpp17[meta cpp]
namespace std {
template <class ForwardIterator, class Size>
ForwardIterator destroy_n(ForwardIterator first,
Size n); // (1) C++17
template <class ForwardIterator, class Size>
constexpr ForwardIterator destroy_n(ForwardIterator first,
Size n); // (1) C++20
template <class ExecutionPolicy, class ForwardIterator, class Size>
ForwardIterator destroy_n(ExecutionPolicy&& exec,
ForwardIterator first,
Size n); // (2) C++17
template <class ExecutionPolicy, class ForwardIterator, class Size>
constexpr ForwardIterator destroy_n(ExecutionPolicy&& exec,
ForwardIterator first,
Size n); // (2) C++20
}
イテレータ範囲[first, first + n)
の各要素に対してデストラクタを呼び出す。
この関数は、配置new
で構築したオブジェクトの配列を破棄するために使用する。
以下と等価:
for (; n > 0; (void)++first, --n)
destroy_at(addressof(*first));
return first;
- destroy_at[link destroy_at.md]
- addressof[link addressof.md]
- 非トリビアルなデストラクタをもたない
int
やchar
配列のような型のオブジェクトに対しては、デストラクタを呼び出す必要はない。ForwardIterator
の値型T
がstd::is_trivially_destructible_v
<T> == true
である場合、 (効果欄のfor
文も含めて) なにもしない最適化が行われる可能性がある- 例として、
std::optional
クラスのデストラクタ、およびstd::vector
クラスのデストラクタを参照
- 例として、
#include <iostream>
#include <memory>
int main()
{
// 配置newで配列を構築
char storage[4 * 3];
int* n = new(storage) int[3];
n[0] = 3;
n[1] = 1;
n[2] = 4;
for (int i = 0; i < 3; ++i) {
std::cout << n[i] << std::endl;
}
// デストラクタを呼び出して配列の各要素を破棄
std::destroy_n(n, 3);
}
- std::destroy_n[color ff0000]
3
1
4
- C++17
- Clang: 4.0.1 [mark verified]
- GCC: 7.3 [mark verified]
- Visual C++: ??