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以下であること
事後条件
例外
- (2), (3) : 投げない
定数式に評価される条件
- (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
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??