• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <memory>

    std::ranges::construct_at

    namespace std::ranges {
      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::ranges::construct_at(reinterpret_cast<int*>(storage));
    
      *n = 314;
      std::cout << *n << std::endl;
    
      // デストラクタを呼び出して破棄
      std::ranges::destroy_at(n);
    }
    

    出力

    314
    

    バージョン

    言語

    • C++20

    処理系

    関連項目

    参照