교체 함수(replacement function)
교체 함수(replacement function)
구현(implementation)이 정의를 제공하는 일부 표준 함수는, 프로그램이 그 정의를 직접 바꿔치기할 수 있도록 열려 있어요. 이런 함수를 **교체 가능 함수(replaceable function)**라고 하고, 프로그램이 그 함수의 시그니처와 똑같은 시그니처로 직접 정의한 함수를 **교체 함수(replacement function)**라고 불러요. 교체 함수를 제공하면, 구현이 기본으로 제공하는 버전 대신 그 함수가 사용돼요. 이러한 교체는 프로그램 시작 전에 일어나요.
출처: cppreference
본문
조건
교체 함수의 선언이 다음 조건 중 하나라도 만족하지 않으면 프로그램은 ill-formed이며, 이때 진단은 필요 없어요(no diagnostic required).
inline이 아니다.- 전역 모듈(global module)에 붙어 있다(attached).
- C++ 언어 연결(language linkage)을 가진다.
- 교체 가능 함수와 같은 반환 타입을 가진다.
- 교체 가능 함수가 표준 라이브러리 헤더에 선언되어 있다면, 그 헤더의 선언에 대한 올바른 재선언(redeclaration)이어야 한다.
핵심 언어(Core language)
계약 위반 처리기(contract-violation handler) ::handle_contract_violation이 교체 가능한지는 구현 정의(implementation-defined)다. |
(C++26부터) |
표준 라이브러리(Standard library)
다음 표준 라이브러리 함수들은 교체 가능하며, 함수 의미에 대한 설명은 C++ 표준 라이브러리가 정의한 기본 버전과 프로그램이 정의한 교체 함수 양쪽 모두에 적용돼요.
- 할당 함수(operator
new)와 해제 함수(operatordelete) — 프로그램이::operator new/::operator delete를 직접 정의하면 전역 할당·해제가 그 함수로 대체돼요.
예제
할당 함수를 교체해서, 실제로 new가 교체 버전을 부르는지 확인해 볼게요.
#include <cstddef>
#include <new>
#include <print>
// 교체 함수
void* operator new(std::size_t count)
{
std::print("Replaced!");
return nullptr;
}
int main()
{
int* ptr = new int; // 프로그램이 정의한 교체 버전이 호출됨
}
출력:
Replaced!
new int를 실행하면 표준 라이브러리의 operator new 대신 프로그램이 정의한 교체 함수가 호출돼서 Replaced!가 출력돼요.
더 알아보기
inline지정자: 교체 함수는inline이면 안 되는 이유와 관련된 선언 규칙.- 모듈(modules): 전역 모듈에 붙은 선언이 교체 함수의 조건이 되는 이유.
- 언어 연결(language linkage): C++ 언어 연결이 교체 함수에 요구되는 이유.