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にアライメントされていることをユーザーが保証することで構築できる。
テンプレートパラメータ制約
- 説明専用コンセプト
tagging-compatible-pointeeによって、コンストラクタ(2)と同じ要件が、alignof(U)の代わりに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
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??