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로 평가될 것임을 지정하는 속성 지정자예요.