contract_assert 문
contract_assert 문 (Contract assert statement)
함수나 람다 본문 안에서 내부 조건을 확인하는 수단이 바로 contract_assert 문이에요. 실행하는 동안 그 조건이 성립하는지 검증해 주고, 조건이 false로 평가되거나 평가 과정에서 예외로 빠져나가면 디버그 빌드에서는 위반(가령 프로그램 종료)을 일으키죠. 성능 때문에 릴리스 빌드에서는 무시하도록 만들 수도 있어요.
출처: cppreference
본문
contract_assert 문은 함수나 람다 바디에 나타날 수 있는 계약 단언(contract assertion)으로, 내부 조건을 검증해요. 실행 중에 조건이 성립하는지 확인하고, 조건이 false로 평가되거나 평가가 예외로 끝나면 위반을 일으킵니다(예: 프로그램 종료). 릴리스 빌드에서는 성능을 위해 무시할 수 있어요.
구문 (Syntax)
contract_assert attr(선택) ( predicate ) ;
| 항목 | - | 설명 |
|---|---|---|
attr |
- | 임의 개수의 속성 |
predicate |
- | true로 평가되어야 하는 bool 표현식 |
키워드 (Keywords)
contract_assert
참고 (Notes)
| Feature-test 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_contracts |
202502L | (C++26) | Contracts |
예제 (Example)
contract_assert는 벡터의 노름(norm)이 양수이고, 정상(normal)이거나 정규화되지 않은(subnormal) 값인지 확인해요.
template <std::floating_point T>
constexpr auto normalize(std::array<T, 3> vector) noexcept
pre(/* is_normalizable(vector) */)
post(/* vector: is_normalized(vector) */)
{
auto& [x, y, z]{vector};
const auto norm{std::hypot(x, y, z)};
// debug check for normalization safety
contract_assert(std::isfinite(norm) && norm > T(0));
x /= norm, y /= norm, z /= norm;
return vector;
}
참조 (References)
- C++26 표준 (ISO/IEC 14882:2026):
- 8.(7+c) Assertion statement [stmt.contract.assert]
더 알아보기 (Learn more)
assert— 사용자가 지정한 조건이 참이 아니면 프로그램을 중단해요. 릴리스 빌드에서는 비활성화될 수 있는 함수 매크로예요.- 계약 단언 (C++26) — 실행 중 특정 시점에 성립해야 하는 속성을 지정해요.
static_assert선언 (C++11) — 컴파일 타임 단언 검사를 수행해요.- 함수 계약 지정자 (C++26) — 선행 조건(
pre)과 후행 조건(post)을 지정해요. [[assume(expression)]](C++23) — 주어진 지점에서 표현식이 항상true로 평가될 것임을 지정하는 속성 지정자예요.