最終更新日時: 2024年12月22日 15時27分29秒 (JST)
Raclamusi が更新

履歴 編集

function template
<memory>

# std::ranges::destroy_at(C++20)

    namespace std::ranges {
      template <destructible T>
      constexpr void destroy_at(T* location) noexcept; // (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 = 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 ✅

## 関連項目

- `destroy_at`

## 参照

- P0896R4 The One Ranges Proposal