tagged_pointer_type tagged_pointer() const noexcept; // (1) C++29
概要
タグを下位ビットへ埋め込んだままの、生のポインタ値を取得する。
既存のポインタタギング実装(ビット演算による手書きのタグ付きポインタなど)との相互運用のための操作であり、戻り値は有効なオブジェクトを指さない無効なポインタ値である。取得した値はfrom_tagged()でpointer_tag_pairへ復元できる。
戻り値
tagged_pointer_type型(PtrのCV修飾を維持したvoid*)の未規定の値。同じ値をfrom_tagged()へ渡すと、元のポインタ値とタグ値を持つオブジェクトが得られる。
例外
投げない。
備考
- 戻り値は動作が処理系定義である無効なポインタ値であるため、この関数は
constexprではなく、間接参照してはならない max_pointer_bits_availableが非0である処理系では、無効なポインタに対する非算術操作が、from_tagged()による復元に十分な情報を保存することが示される
例
#include <memory>
#include <iostream>
// タグ付きポインタを void* として受け渡す既存のAPI
void legacy_api(void* tagged)
{
auto p = std::pointer_tag_pair<int*, 2>::from_tagged(tagged);
std::cout << *p.pointer() << ':' << p.tag() << std::endl;
}
int main()
{
int x = 42;
std::pointer_tag_pair<int*, 2> p{&x, 3u};
legacy_api(p.tagged_pointer());
}
出力
42:3
バージョン
言語
- C++29
処理系
- Clang: ??
- GCC: ??
- Visual C++: ??