namespace std::ranges {
template <destructible T>
constexpr void destroy_at(T* location) noexcept; // (1) C++20
}
概要
デストラクタを呼び出す。
この関数は、配置new
で構築したオブジェクトを破棄するために使用する。
効果
-
型
T
が配列型である場合、以下と等価:
-
そうでない場合、以下と等価:
location->~T();
備考
- 非トリビアルなデストラクタをもたない
int
やchar
配列のような型のオブジェクトに対しては、デストラクタを呼び出す必要はない。std::is_trivially_destructible_v<T> == true
な型に対しては、なにもしない最適化が行われる可能性がある- 例として、
std::optional
クラスのデストラクタ、およびstd::vector
クラスのデストラクタを参照
- 例として、
例
#include <iostream>
#include <memory>
int main()
{
// 配置newでオブジェクトを構築
char storage[4];
int* n = std::ranges::construct_at(reinterpret_cast<int*>(storage));
*n = 314;
std::cout << *n << std::endl;
// デストラクタを呼び出して破棄
std::ranges::destroy_at(n);
}
出力
314
バージョン
言語
- C++20
処理系
- Clang: 16.0 ✅
- GCC: 10.2.0 ✅
- Visual C++: 2019 Update 10 ✅