- 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-derivedなpの複製。
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]