Namespaces
Variants

std::destroy

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

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


 
 
ヘッダ <memory>
template< class ForwardIt >
void destroy( ForwardIt first, ForwardIt last );
で定義 (1) (C++17 から)
(C++20 まで)
template< class ForwardIt >
constexpr void destroy( ForwardIt first, ForwardIt last );
(C++20 から)
template< class ExecutionPolicy, class ForwardIt >
void destroy( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last );
(2) (C++17 から)
1) 対象範囲の要素を破棄する [first, last) あたかも次のように
for (; first != last; ++first)
    std::destroy_at(std::addressof(*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, last - 破棄する要素の範囲を定義するイテレータのペア
policy - 使用する実行ポリシー
型要件
-
ForwardIt は LegacyForwardIterator の要件を満たさなければならない。
-
ForwardIt の有効なインスタンスを通じたインクリメント、代入、比較、間接参照は例外をスローしてはならない。

例外

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

実装例

template<class ForwardIt>
constexpr // since C++20
void destroy(ForwardIt first, ForwardIt last)
{
    for (; first != last; ++first)
        std::destroy_at(std::addressof(*first));
}
HTMLタグ、属性、および``、`
`タグ内のC++コードは翻訳せず、元のフォーマットを保持しました。C++固有の用語も翻訳していません。

例

連続した要素のシーケンスを破棄するために destroy を使用する方法を示します。

#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(ptr, ptr + 4);
}

出力:

0 destructed
1 destructed
2 destructed
3 destructed

関連項目

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