最終更新日時:
が更新

履歴 編集

function template
<memory>

std::pointer_tag_pair::from_overaligned(C++29)

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

概要

型のアライメントより大きくアライメントされている(過剰アライメントされている)と約束したポインタから、pointer_tag_pairを構築する。

指す先の型のアライメントだけではタグに必要なビット数を確保できない場合でも、実際のポインタ値がPromisedAlignmentにアライメントされていることをユーザーが保証することで構築できる。

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

事前条件

  • pがオブジェクトの末尾の次を指すポインタではないこと
  • p == nullptr || is_sufficiently_aligned<PromisedAlignment>(p)trueであること
  • タグ値tの表現に必要なビット数がbits_requested以下であること

戻り値

ptp.pointer()pと等値、ptp.tag()tと等値であるようなオブジェクトptpを返す。

例外

投げない。

定数式に評価される条件

事前条件を満たしていること。

備考

  • 事前条件違反となりうる危険な操作であるため、意図が目立つよう、通常のコンストラクタとは別の冗長な名前の関数として提供される

#include <memory>
#include <iostream>

int main()
{
  // charのアライメントは1だが、64バイト境界に確保したポインタであることを
  // 約束して、6ビットのタグを詰め込む
  alignas(64) char buffer[64] = "Hello";

  auto p = std::pointer_tag_pair<char*, 6>::from_overaligned<64>(buffer, 42u);
  std::cout << p.pointer() << ':' << p.tag() << std::endl;
}

出力

Hello:42

バージョン

言語

  • C++29

処理系

参照