Skip to content

Latest commit

 

History

History
156 lines (119 loc) · 5.82 KB

File metadata and controls

156 lines (119 loc) · 5.82 KB

コンストラクタ

  • memory[meta header]
  • std[meta namespace]
  • indirect[meta class]
  • function[meta id-type]
  • cpp26[meta cpp]
explicit constexpr
  indirect();                          // (1)

explicit constexpr
  indirect(allocator_arg_t,
           const Allocator& a);        // (2)

constexpr
  indirect(const indirect& other);     // (3)

constexpr
  indirect(allocator_arg_t,
           const Allocator& a,
           const indirect& other);     // (4)

constexpr
  indirect(indirect&& other) noexcept; // (5)

constexpr
  indirect(allocator_arg_t,
           const Allocator& a,
           indirect&& other) noexcept(see below); // (6)

template <class U = T>
explicit constexpr
  indirect(U&& u);                     // (7)

template <class U = T>
explicit constexpr
  indirect(allocator_arg_t,
           const Allocator& a, U&& u); // (8)

template <class... Us>
explicit constexpr
  indirect(in_place_t,
           Us&&... us);                // (9)

template <class... Us>
explicit constexpr
  indirect(allocator_arg_t,
           const Allocator& a,
           in_place_t,
           Us&&... us);                // (10)

template <class I, class... Us>
explicit constexpr
  indirect(in_place_t,
           initializer_list<I> ilist,
           Us&&... us);                // (11)

template <class I, class... Us>
explicit constexpr
  indirect(allocator_arg_t,
           const Allocator& a,
           in_place_t,
           initializer_list<I> ilist,
           Us&&... us);                // (12)
  • allocator_arg_t[link /reference/memory/allocator_arg_t.md]
  • in_place_t[link /reference/utility/in_place_t.md]
  • initializer_list[link /reference/initializer_list/initializer_list.md]

概要

indirectオブジェクトを構築する。allocator_arg_tを第1引数に取るオーバーロードは、使用するアロケータaを明示的に指定する。

  • (1), (2) : デフォルトコンストラクタ。Tをデフォルト構築して所有する。
  • (3), (4) : コピーコンストラクタ。otherが所有するオブジェクトをディープコピーして所有する。otherが無効値状態の場合、構築されるオブジェクトも無効値状態となる。
  • (5), (6) : ムーブコンストラクタ。otherが所有するオブジェクトの所有権を移す。ムーブ後のotherは無効値状態となる。
  • (7), (8) : 単一の引数uからTを構築して所有する。
  • (9), (10) : in_place_tをマーカーとして、引数us...からTを直接構築して所有する。
  • (11), (12) : in_place_tをマーカーとして、初期化子リストと引数us...からTを直接構築して所有する。

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

適格要件

例外

  • すべてのオーバーロード : allocator_traits<Allocator>::allocate()またはallocator_traits<Allocator>::construct()が例外を送出した場合を除いて、例外を送出しない。
  • (6) : 以下と等価なnoexcept指定を持つ:
noexcept(allocator_traits<Allocator>::is_always_equal::value)
  • allocator_traits[link /reference/memory/allocator_traits.md]

事後条件

  • (5), (6) : otherは無効値状態となる。

#include <cassert>
#include <memory>
#include <string>
#include <utility>

int main()
{
  std::indirect<int> a;                          // (1) デフォルト構築
  assert(*a == 0);

  std::indirect<int> b{42};                       // (7) 単一の引数から構築
  assert(*b == 42);

  std::indirect<std::string> c{std::in_place, 3, 'x'}; // (9) in_placeで直接構築
  assert(*c == "xxx");

  std::indirect<int> d = b;                       // (3) コピー構築(ディープコピー)
  assert(*d == 42);

  std::indirect<int> e = std::move(d);            // (5) ムーブ構築
  assert(*e == 42);
  assert(d.valueless_after_move());               // ムーブ後は無効値状態
}
  • std::indirect[link ../indirect.md]
  • std::in_place[link /reference/utility/in_place_t.md]

出力

バージョン

言語

  • C++26

処理系

  • Clang: 22 [mark noimpl]
  • GCC: 16.1 [mark verified]
  • Visual C++: 2026 Update 2 [mark noimpl]

関連項目

参照