置換関数
From cppreference.com
実装によって定義が提供される特定の関数は、置き換え可能です。C++プログラムは、置き換え可能な関数のシグネチャを持つ定義を提供することができ、これを置き換え関数と呼びます。置き換え関数が提供された場合、実装によって提供されるデフォルトのバージョンではなく、その関数が使用されます。このような置き換えは、プログラムの起動前に行われます。
置き換え関数の宣言が以下のいずれの条件も満たさない場合、プログラムは形式を誤っており、診断は不要です
- インラインではありません。
- グローバルモジュールにアタッチされています。
- C++言語リンケージを持っています。
- 置き換え可能な関数と同じ戻り値の型を持っています。
- 置き換え可能な関数が標準ライブラリヘッダーで宣言されている場合、そのヘッダー内の宣言の再宣言として有効です。
コア言語契約違反ハンドラー ::handle_contract_violation が置き換え可能であるかどうかは、実装定義です。 |
(C++26以降) |
[編集] 標準ライブラリ
以下の標準ライブラリ関数は置き換え可能であり、関数のセマンティクスの説明は、C++標準ライブラリによって定義されるデフォルトバージョンと、プログラムによって定義される置き換え関数の両方に適用されます
| メモリ割り当て関数 (関数) | |
| メモリ解放関数 (関数) | |
| (C++26) |
プログラムがデバッガーの制御下で実行されているかを確認する (関数) |
[編集] 例
置き換え割り当て関数を使用
このコードを実行
#include <cstddef> #include <new> #include <print> // replacement function void* operator new(std::size_t count) { std::print("Replaced!"); return nullptr; } int main() { int* ptr = new int; // invokes the replacement version defined by the program }
出力
Replaced!