最終更新日時:
が更新

履歴 編集

function
<memory>

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

tagged_pointer_type tagged_pointer() const noexcept; // (1) C++29

概要

タグを下位ビットへ埋め込んだままの、生のポインタ値を取得する。

既存のポインタタギング実装(ビット演算による手書きのタグ付きポインタなど)との相互運用のための操作であり、戻り値は有効なオブジェクトを指さない無効なポインタ値である。取得した値はfrom_tagged()pointer_tag_pairへ復元できる。

戻り値

tagged_pointer_type型(PtrCV修飾を維持した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

処理系

参照