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

履歴 編集

function
<memory>

std::indirect::コンストラクタ(C++26)

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)

概要

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を直接構築して所有する。

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

適格要件

例外

noexcept(allocator_traits<Allocator>::is_always_equal::value)

事後条件

  • (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());               // ムーブ後は無効値状態
}

出力

バージョン

言語

  • C++26

処理系

関連項目

参照