最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<memory>

# std::construct_at(C++20)

    namespace std {
      template <class T, class... Args>
      constexpr T* construct_at(T* location, Args&&... args); // (1) C++20
    }

## 概要

コンストラクタを呼び出す。

`location`の位置に配置newで型`T`のコンストラクタを呼び出す。

## テンプレートパラメータ制約

- 式`::new (declval<void*>()) T(declval<Args>()...)`が評価されないオペランドとして扱われる場合に、適格であること

## 効果

以下の関数があるとして、

    template<class T>
    constexpr void* voidify(T& ptr) noexcept {
      return const_cast<void*>(static_cast<const volatile void*>(addressof(ptr)));
    }

以下と等価：

    auto ptr = ::new (voidify(*location)) T(std::forward<Args>(args)...);
    if constexpr (is_array_v<T>)
      return launder(location);
    else
      return ptr;

## 例

    #include <iostream>
    #include <memory>

    int main()
    {
      // 配置newでオブジェクトを構築
      char storage[4];
      int* n = std::construct_at(reinterpret_cast<int*>(storage));

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

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

### 出力

    314

## バージョン

### 言語

- C++20

### 処理系

- Clang: 12.0 ✅
- GCC: 10.1 ✅
- Visual C++: ??

## 関連項目

- C++20 可変サイズをもつコンテナの`constexpr`化
- C++26 `constexpr`配置`new`
- `std::ranges::construct_at`

## 参照

- P0040R3 Extending memory management tools
- P0784R7 More `constexpr` containers
- LWG Issue 3436. `std::construct_at` should support arrays