Namespaces
Variants

std::destroy_n

ja.cppreference.net から
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy、 ranges::sort、...
ソートと関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対して)
集合操作 (ソート済み範囲に対して)
マージ操作 (ソート済み範囲に対して)
ヒープ操作
最小/最大操作
(C++11)
(C++17)
辞書式比較操作
順列操作


 
 
ヘッダ <memory>
template< class ForwardIt, class Size >
ForwardIt destroy_n( ForwardIt first, Size count );
で定義 (1) (C++17から)
(constexpr C++20から)
template< class ExecutionPolicy, class ForwardIt, class Size >
ForwardIt destroy_n( ExecutionPolicy&& policy, ForwardIt first, Size count );
(2) (C++17から)
1) 対象範囲 count 内の最初の [first, last) 要素を次のように破棄する
for (; count > 0; (void) ++first, --count)
    std::destroy_at(std::addressof(*first));
return first;
2) (1) と同じだが、 に従って実行される。policy
このオーバロードは、次の式の値が true である場合にのみオーバロード解決に参加する:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(C++20から)

パラメータ

first - 破棄する要素の範囲の先頭
count - 破棄する要素の数
policy - 使用する実行ポリシー
型要件
-
ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。
-
有効な ForwardIt のインスタンスに対するインクリメント、代入、比較、または間接参照は例外をスローしてはなりません。

戻り値

上記の通り。

例外

2) 実行処理中:
  • 並列化に必要な一時メモリリソースが利用できない場合、std::bad_alloc がスローされます。
  • アルゴリズム引数を介してオブジェクトにアクセスしているときにキャッチされない例外がスローされた場合、動作は実行ポリシーによって決まります(標準ポリシー、std::terminate が呼び出されます)。

例

destroy_nを使用して連続する要素のシーケンスを破棄する方法を示します。

#include <iostream>
#include <memory>
#include <new>

struct Tracer
{
    int value;
    ~Tracer() { std::cout << value << " destructed\n"; }
};

int main()
{
    alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 4];
    
    for (int i = 0; i < 4; ++i)
        new (buffer + sizeof(Tracer) * i) Tracer{i}; // manually construct objects

    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));

    std::destroy_n(ptr, 4);
}

出力:

0 destructed
1 destructed
2 destructed
3 destructed

関連項目

(C++17)
オブジェクトの範囲を破棄する
(関数テンプレート)
(C++17)
指定されたアドレスのオブジェクトを破棄する
(関数テンプレート)
範囲内の指定された数のオブジェクトを破棄する
(アルゴリズム関数オブジェクト)