⚰️C++的ゾンビのお名前🧟

“こんなゾンビだらけの言語に居られるか！俺は他の言語に出て行くぜ！” -- 行方知れずのプログラマー


# 🧟Zombie Names📛
C++17標準ライブラリ仕様から「Zombie names」というセクションが追加され、過去バージョンで利用していた識別子（クラス名や関数名など）が予約済みとして列挙されるようになりました。[^1]

...嘘じゃないよ：https://eel.is/c++draft/zombie.names

[^1]: 名前空間`std`以下の識別子として予約済みというお話です。ユーザプログラムでこれらの名前を使えなくなる訳ではありません。本記事の内容とは別に、ユーザプログラムが名前空間`std`に宣言・定義を追加することは禁止されています（一部特例を除く）。https://eel.is/c++draft/namespace.std


## C互換ライブラリ［C++11で非推奨, C++14で削除］
- `gets`

[バッファオーバーラン脆弱性につながる](https://www.jpcert.or.jp/sc-rules/c-msc24-c.html)ため、今すぐ利用停止してください。バッファサイズを明示指定する`fgets`関数で代替可能です。


## スマートポインタ`auto_ptr<T>`［C++11で非推奨, C++17で削除］
- `auto_ptr`
- `auto_ptr_ref`

C++11以降は[`unique_ptr`クラス](https://cpprefjp.github.io/reference/memory/unique_ptr.html)で代替可能です。


## 関数アダプタ［C++11で非推奨, C++17で削除］
- `binary_function`
- `binary_negate`
- `bind1st`
- `bind2nd`
- `binder1st`
- `binder2nd`
- `const_mem_fun1_ref_t`
- `const_mem_fun1_t`
- `const_mem_fun_ref_t`
- `const_mem_fun_t`
- `mem_fun1_ref_t`
- `mem_fun1_t`
- `mem_fun_ref_t`
- `mem_fun_ref`
- `mem_fun_t`
- `mem_fun`
- `not1`
- `not2`
- `pointer_to_binary_function`
- `pointer_to_unary_function`
- `ptr_fun`
- `unary_function`
- `unary_negate`

C++11以降は[ラムダ式(lambda expression)](https://cpprefjp.github.io/lang/cpp11/lambda_expressions.html)や[`bind`](https://cpprefjp.github.io/reference/functional/bind.html)、[`mem_fn`](https://cpprefjp.github.io/reference/functional/mem_fn.html)、[`not_fn`](https://cpprefjp.github.io/reference/functional/not_fn.html)［C++17］、[`bind_front`](https://cpprefjp.github.io/reference/functional/bind_front.html)［C++20］各種アダプタで代替可能です。


## ランダムシャッフル［C++14で非推奨, C++17で削除］
- `random_shuffle`

C++11以降は[`shuffle`関数](https://cpprefjp.github.io/reference/algorithm/shuffle.html)で代替可能です。


## 例外指定違反ハンドラ［C++17で削除］
- `get_unexpected`
- `unexpected`
- `unexpected_handler`
- `set_unexpected`

これらの関数が対象としていた[例外指定(exception specification)はC++11で非推奨、C++17で削除](https://cpprefjp.github.io/lang/cpp17/remove_deprecated_exception_specifications.html)されています。


## 未初期化ストレージ［C++17で非推奨, C++20で削除］
- `get_temporary_buffer`
- `raw_storage_iterator`
- `return_temporary_buffer`

実質的に[役に立たないとの判断](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0174r2.html#3.3)です。直接代替する機能はありません。


## リテラル型判定［C++17で非推奨, C++20で削除］
- `is_literal_type`
- `is_literal_type_v`

実質的に[役に立たないとの判断](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0174r2.html#2.3)です。直接代替する機能はありません。


## `result_of`メタ関数［C++17で非推奨, C++20で削除］
- `result_of`
- `result_of_t`

C++17以降は[`invoke_result`メタ関数](https://cpprefjp.github.io/reference/type_traits/invoke_result.html)で代替可能です。


## 処理中例外カウント［C++20で削除］
- `uncaught_exception`

C++17以降は[`uncaught_exceptions`関数](https://cpprefjp.github.io/reference/exception/uncaught_exceptions.html)で代替可能です（※末尾の`s`有無）。


## GCサポート［C++23で削除］
- `declare_no_pointers`
- `declare_reachable`
- `get_pointer_safety`
- `pointer_safety`
- `undeclare_no_pointers`
- `undeclare_reachable`

結局誰にも利用されなかったため、C++23仕様にて[GCサポートは削除](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html)されます（予定）。[^2]
[^2]: C++言語におけるGC(ガベージコレクション)サポートとは、実際に動作可能なGC機構を提供するのでなく、将来誰かがGC機構を作るときに必要となるであろう低レイヤ機構のみを規定します。最近も[どこかで見た](https://cpprefjp.github.io/lang/cpp20/coroutines.html)C++言語あるあるパターン。このGCサポートはC++11で導入されていました。ご存じでした？


# 🦕🦖ところで🕵️‍♂️
C++言語仕様にはゾンビ(Zombie)の他にも、[たくさんの恐竜たち](https://yohhoy.hatenadiary.jp/entry/20210713/p1) や [ジェームズ・ボンド(James Bond)](https://yohhoy.hatenadiary.jp/entry/20210512/p1) が潜んでいたりします。にぎやかですね。