Namespaces
Variants

Replacement functions

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Некоторые функции, для которых реализация предоставляет определение, являются заменяемыми  . Программа на C++ может предоставить определение с сигнатурой заменяемой функции, называемое заменяющей функцией  . Заменяющая функция, если она предоставлена, используется вместо версии по умолчанию, предоставляемой реализацией. Такая замена происходит до запуска программы.

Если объявление функции замены не удовлетворяет ни одному из следующих условий, программа является некорректной, диагностика не требуется:

Основной язык

Определяется реализацией, является ли обработчик нарушения контрактов :: handle_contract_violation заменяемым.

(начиная с C++26)

Стандартная библиотека

Следующие функции стандартной библиотеки являются заменяемыми, и описание семантики функций применяется как к версии по умолчанию, определённой стандартной библиотекой C++, так и к заменяющей функции, определённой программой:

функции выделения памяти
(функция)
функции освобождения памяти
(функция)
проверяет, выполняется ли программа под управлением отладчика
(функция)

Пример

Использует заменяющую функцию распределения:

#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!