最終更新日時:
が更新

履歴 編集

function
<memory>

std::pointer_tag_pair::コンストラクタ(C++29)

constexpr pointer_tag_pair() noexcept;               // (1) C++29

template <tagging-compatible-pointee<pointer_type, bits_requested> U>
constexpr pointer_tag_pair(U* p, tag_type t);        // (2) C++29

constexpr pointer_tag_pair(nullptr_t p, tag_type t); // (3) C++29

概要

  • (1) : デフォルトコンストラクタ。ヌルポインタとタグの初期値で構築する
  • (2) : ポインタpとタグ値tのペアを構築する
  • (3) : ヌルポインタとタグ値tのペアを構築する

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

  • (2) : 説明専用コンセプトtagging-compatible-pointeeによって、以下が要求される
    • U*pointer_typeへ変換可能であること
    • pointer_bits_available(alignof(U)) >= bits_requestedであること(Uのアライメントから、要求したビット数を確保できること)
    • 指す先の型がvoid・スカラ型・共用体であるか、または指す先の型がUのポインタ相互変換可能な基底クラスであること

事前条件

  • (2), (3) :
    • pがオブジェクトの末尾の次を指すポインタではないこと
    • タグ値tの表現に必要なビット数がbits_requested以下であること

事後条件

  • (1) : pointer()がヌルポインタと等値であり、tag()TagT()と等値である
  • (2), (3) : pointer()pと等値であり、tag()tと等値である

例外

  • (2), (3) : 投げない

定数式に評価される条件

#include <memory>
#include <iostream>

int main()
{
  int x = 42;

  std::pointer_tag_pair<int*, 2> p{&x, 0b11u};
  std::cout << *p.pointer() << ':' << p.tag() << std::endl;

  // タグが2ビットに収まらない場合は事前条件違反となる
  // std::pointer_tag_pair<int*, 2> bad{&x, 0b100u};
}

出力

42:3

バージョン

言語

  • C++29

処理系

参照