Replacement functions
| 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 | ||||||||||||||||
|
||||||||||||||||
| 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 | ||||||||||||||||
| Declarations | ||||
| Function declaration | ||||
| Function parameter list | ||||
| Function definition | ||||
| Function contract specifiers (C++26) | ||||
| Default arguments | ||||
| Variadic arguments | ||||
inline
specifier
|
||||
| Lambda expressions (C++11) | ||||
| Coroutines (C++20) | ||||
| Replacement functions | ||||
| Function calls | ||||
| Argument-Dependent Lookup (ADL) | ||||
| Function-call operator | ||||
| Function objects | ||||
| Overloading | ||||
| Overload resolution | ||||
| Operator overloading | ||||
| Address of an overload set |
Некоторые функции, для которых реализация предоставляет определение, являются заменяемыми . Программа на C++ может предоставить определение с сигнатурой заменяемой функции, называемое заменяющей функцией . Заменяющая функция, если она предоставлена, используется вместо версии по умолчанию, предоставляемой реализацией. Такая замена происходит до запуска программы.
Если объявление функции замены не удовлетворяет ни одному из следующих условий, программа является некорректной, диагностика не требуется:
- Он не является inline .
- Он attached к глобальному модулю.
- Имеет C++ language linkage .
- Имеет тот же возвращаемый тип, что и заменяемая функция.
- Если заменяемая функция объявлена в стандартном заголовочном файле библиотеки , это будет допустимо как переобъявление объявления в этом заголовочном файле.
Основной языкОпределяется реализацией, является ли обработчик нарушения контрактов :: 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!