std:: destroy
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定義先ヘッダ
<memory>
|
||
|
template
<
class
ForwardIt
>
void destroy ( ForwardIt first, ForwardIt last ) ; |
(1) |
(C++17以降)
(constexpr since C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt
>
void destroy ( ExecutionPolicy && policy, ForwardIt first, ForwardIt last ) ; |
(2) | (C++17以降) |
[
first
,
last
)
内のオブジェクトを破棄する。以下のように動作する:
for (; first != last; ++first) std::destroy_at(std::addressof(*first));
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> が true であること。 |
(C++20以前) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> が true であること。 |
(C++20以降) |
目次 |
パラメータ
| first, last | - | 破棄する要素の範囲を定義するイテレータのペア |
| policy | - | 使用する実行ポリシー |
| 型要件 | ||
-
ForwardIt
は
LegacyForwardIterator
の要件を満たさなければならない。
|
||
-
ForwardIt
の有効なインスタンスを通じたインクリメント、代入、比較、間接参照は例外をスローしてはならない。
|
||
計算量
first と last の間の距離に対して線形。
例外
ExecutionPolicy
という名前のテンプレートパラメータを持つオーバーロードは、
以下のようにエラーを報告します:
-
アルゴリズムの一部として呼び出された関数の実行が例外をスローした場合、
ExecutionPolicyが 標準ポリシー のいずれかであるときは、 std::terminate が呼び出されます。その他のExecutionPolicyについては、動作は実装定義です。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc がスローされます。
実装例
template<class ForwardIt> constexpr // since C++20 void destroy(ForwardIt first, ForwardIt last) { for (; first != last; ++first) std::destroy_at(std::addressof(*first)); } |
`、`
`タグ内の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) * 8]; for (int i = 0; i != 8; ++i) new(buffer + sizeof(Tracer) * i) Tracer{i}; // manually construct objects auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer)); std::destroy(ptr, ptr + 8); }
出力:
0 destructed 1 destructed 2 destructed 3 destructed 4 destructed 5 destructed 6 destructed 7 destructed
関連項目
|
(C++17)
|
範囲内の複数のオブジェクトを破棄する
(関数テンプレート) |
|
(C++17)
|
指定されたアドレスのオブジェクトを破棄する
(関数テンプレート) |
|
(C++20)
|
範囲内のオブジェクトを破棄する
(アルゴリズム関数オブジェクト) |