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

履歴 編集

function
<memory>

# std::allocator::construct(C++17で非推奨)(C++20で削除)

    // C++03
    void construct(pointer p, const T& val);

    // C++11
    template <class U, class... Args>
    void construct(U* p, Args&&... args);

この関数は、C++17から非推奨となり、C++20で削除された。代わりに`std::allocator_traits::construct()`関数を使用すること。

## 概要

引数を元にインスタンスを構築する。

## 効果

- C++03 : `new((void *)p) T(val)`
- C++11 : `::new((void *)p) U(std::forward<Args>(args)...)`

## 戻り値

なし

## 非推奨・削除の詳細

多くのメンバ関数は、アロケータの実装によらず、共通に定義できるものだった。そのため、アロケータの中間インタフェースである`std::allocator_traits`クラスに、共通のデフォルト実装を定義することとなった。

特殊なアロケータの実装では、この関数を独自に実装する必要があるかもしれない。その場合は`std::allocator_traits`のデフォルト機能を使用せずに、この関数を独自アロケータのインタフェースとして定義すれば、`std::allocator_traits`クラスを介してインタフェースにアクセスしたとしても、その独自実装が使用される。

少なくとも、`std::allocator`クラスのあらゆる標準ライブラリの実装において、この関数は特殊な動作をする必要がないため、`std::allocator_traits`クラスのデフォルト実装に任せることとなった。

## 例

    #include <iostream>
    #include <memory>
    #include <utility>

    int main()
    {
      using value_type = std::pair<int, char>;
      std::allocator<value_type> alloc;

      std::size_t n = 1;
      value_type* p = alloc.allocate(n);

      // メモリ領域にpairオブジェクトを構築
      alloc.construct(p, 3, 'a');

      std::cout << p->first << ", " << p->second << std::endl;

      alloc.destroy(p);
      alloc.deallocate(p, n);
    }

### 出力

    3, a

### C++11版の処理系対応状況

- Clang: 3.0 ✅
- GCC: 4.3.6 ✅
- ICC: ??
- Visual C++: ??

## 参照

- N2345 Placement Insert for Containers (Revision 2)
- P0174R2 Deprecating Vestigial Library Parts in C++17
- P0619R4 Reviewing deprecated facilities of C++17 for C++20