命名空间
变体
操作

替换函数

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句(循环)
for
range-for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常说明 (until C++17*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

某些函数的定义由实现提供,这些函数是可替换的。 C++ 程序可以提供具有可替换函数签名的定义,称为替换函数。 如果提供了替换函数,则将使用它来代替实现提供的默认版本。 这种替换发生在程序启动之前。

如果替换函数的声明不满足以下任何条件,则程序是非良构的,不需要诊断

  • 它不是内联的。
  • 它附加到全局模块。
  • 它具有 C++ 语言链接。
  • 它具有与可替换函数相同的返回类型。
  • 如果可替换函数在标准库头文件中声明,则它作为该头文件中声明的重新声明是有效的。

核心语言

contract-violation handler 是否可替换是实现定义的。

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