最終更新日時:
が更新

履歴 編集

function template
<memory>

std::start_lifetime(C++26)

namespace std {
  template <class T>
  constexpr void start_lifetime(T& r) noexcept; // (1) C++26
}

概要

参照先のオブジェクトの生存期間を明示的に開始する。

この関数は定数評価の中でも使用でき、主に、共用体メンバとして宣言した配列を未初期化ストレージとして使う場合に、その配列自体の生存期間を開始するために使用する。rが共用体のメンバを参照する場合、そのメンバは共用体のアクティブメンバとなる。

適格要件

T完全型であり、かつ暗黙的生存期間型 (implicit-lifetime type) の集成体であること。

効果

  • rが参照するオブジェクトがすでに生存期間内にある場合、なにもしない
  • そうでない場合、rが参照するオブジェクトの生存期間を開始する
    • 初期化は行われず、部分オブジェクトの生存期間も開始されない
    • rが共用体Uのメンバを表す場合、それはUのアクティブメンバとなる

例外

投げない。

備考

  • start_lifetime_as()は、記憶域を指すポインタvoid*から型Tのオブジェクトを暗黙的に構築し、ネストする暗黙的生存期間型の部分オブジェクトの生存期間も開始する。本関数は、すでに手元にある(が生存期間が開始されていない)オブジェクトを対象として、そのオブジェクト自体の生存期間だけを開始する点が異なる。定数評価で使用できるのは本関数のみである

#include <memory>

struct A {
  union {
    int i;
    int arr[4];
  };
};

constexpr A a = [] {
  A a;
  // 共用体メンバの配列arrの生存期間を開始し、アクティブメンバにする
  // (各要素の生存期間はまだ開始されない)
  std::start_lifetime(a.arr);
  std::construct_at(&a.arr[0], 1);
  return a;
}();
static_assert(a.arr[0] == 1);

int main() {}

このコードはC++26の規則のもとでは適格だが、2026年9月時点で本関数を実装した処理系はない。

出力

バージョン

言語

  • C++26

処理系

関連項目

参照