最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<memory>

# std::destroy_at(C++17)

    namespace std {
      template <class T>
      void destroy_at(T* location);           // (1) C++17

      template <class T>
      constexpr void destroy_at(T* location); // (1) C++20
    }

## 概要

デストラクタを呼び出す。

この関数は、配置`new`で構築したオブジェクトを破棄するために使用する。

## 効果

- 型`T`が配列型である場合、以下と等価：

      destroy(begin(*location), end(*location));

- そうでない場合、以下と等価：

      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 = new(storage) int;

      *n = 314;
      std::cout << *n << std::endl;

      // デストラクタを呼び出して破棄
      std::destroy_at(n);
    }

### 出力

    314

## バージョン

### 言語

- C++17

### 処理系

- Clang: 4.0.1 ✅
- GCC: 7.3 ✅
- Visual C++: ??

## 関連項目

- C++20 可変サイズをもつコンテナの`constexpr`化
- `std::ranges::destroy_at`

## 参照

- P0040R3 Extending memory management tools
- P0784R7 More `constexpr` containers