contract_assert — contract_assert 문
contract_assert — contract_assert 문
contract_assert 문은 함수나 람다 본문 안에 넣어 내부 조건을 검증하는 계약 단언(contract assertion)이에요. 실행 중 조건이 성립하는지 확인해서, 조건이 false로 평가되거나 평가가 예외로 빠지면 위반(violation)을 일으켜요. 디버그 빌드에서는 프로그램을 종료하는 식으로 위반을 알리고, 릴리스 빌드에서는 성능을 위해 무시할 수 있어요.
계약 프로그래밍에서 "이 지점에서는 반드시 이 조건이 참이어야 한다"고 코드에 박아두고 싶을 때 써요. 사전 조건·사후 조건 외에 함수 내부의 중간 불변 조건을 바로 확인할 수 있는 도구예요.
출처: cppreference
본문
contract_assert는 함수 또는 람다 본문에 나타나 내부 조건을 검증하는 계약 단언이에요. 실행 중 조건이 성립함을 보장하며, 조건이 false로 평가되거나 평가가 예외로 종료되면 디버그 빌드에서 위반(예: 종료)을 일으켜요. 릴리스 빌드에서는 성능을 위해 무시될 수 있어요.
문법 (Syntax)
contract_assert attr ( predicate ) ;
attr— 임의 개수의 속성predicate—true로 평가되어야 하는 부울 표현식
노트 (Notes)
C++26의 계약(Contracts) 기능에 속해 있어요. 기능 테스트 매크로 __cpp_contracts가 C++26에서 202502L 값을 가져요.
예제 (Example)
아래 예제에서 contract_assert는 벡터의 노름(norm)이 양수이고 정규(normal) 또는 서브노멀(subnormal)임을 보장해요.
double norm(const std::vector<double>& v)
{
contract_assert(!v.empty()); // 비어 있지 않아야 함
// ... 노름 계산 ...
double n = /* 계산 결과 */;
contract_assert(n > 0.0); // 양수여야 함
return n;
}
이렇게 해두면 디버그 빌드에서 계산 결과가 양수가 아니거나 비정상적인 값이 나오는 순간 바로 프로그램이 멈춰서 문제를 빨리 잡을 수 있어요.