Skip to content

Latest commit

 

History

History
77 lines (54 loc) · 2.37 KB

File metadata and controls

77 lines (54 loc) · 2.37 KB

undeclare_reachable

  • memory[meta header]
  • std[meta namespace]
  • function template[meta id-type]
  • cpp11[meta cpp]
  • cpp23removed[meta cpp]
namespace std {
  template <class T>
  T* undeclare_reachable(T* p);
}

この関数はC++23で削除された。

概要

ポインタの到達可能の宣言を取り下げる。

要件

pが非ヌルである場合:

  • pの参照するオブジェクトは到達可能であると既に宣言されている。
  • 最後のundeclare_reachable(p)の呼び出しまで生存している。

効果

declare_reachable(p)undeclare_reachable(p)が同じ回数呼び出された時、非ヌルなpの参照するオブジェクトの到達可能の宣言が取り消される。

これが起きた場合、pの参照するオブジェクトに対するポインタからは間接参照できなくなる。

戻り値

pと等しいSafely-derivedpの複製。

pに対する宣言が取り消されば場合、戻り値のポインタはSafely-derivedなので、たとえSafely-derivedなポインタが存在しなくとも、戻り値からはpの参照するオブジェクトにアクセスできる。

例外

なし

備考

  • declare_reachable()で確保されたメモリは、その宣言の取り消しまで解放されない。
  • 長時間稼働するプログラムは、2つの関数の呼び出しがそれぞれ対応するように整えるべきである。
  • この関数がテンプレート引数を取るのは、戻り値が使用されることを想定しているためである。

#include <memory>
#include <cstdlib>

int main()
{
  int* p = new int(100);
  std::undeclare_reachable(p); // ill-formed
  return EXIT_SUCCESS;
}
  • std::undeclare_reachable[color ff0000]
  • EXIT_SUCCESS[link /reference/cstdlib/exit_success.md]

バージョン

言語

  • C++11

処理系

  • GCC: ?
  • Clang: 3.4 (relaxed実装) [mark verified]
  • ICC: ?
  • Visual C++: 2010 [mark verified], 2012 [mark verified], 2013 (relaxed実装) [mark verified]

参照