Contracts 우려 속 C++26 DIS 표결 부결…후속 경로는 미정
2026년 10월 23일 C++26 국제표준안은 DIS 표결에서 필요한 3분의 2 찬성을 얻지 못해 국제표준으로 출판되지 못했습니다. WG21 위원 Andreas Fertig는 개인 블로그에서 여러 국가기구가 함수의 사전·사후 조건 등을 코드에 적는 Contracts 기능을 표준에 넣기에는 준비가 덜 됐다고 봤다고 전했습니다. 수정안 재표결·위원회 단계 회귀·기술 명세 발행·취소가 후속 경로로 남았지만, 모두 WG21의 다수 지지를 필요로 하고 차기 표준 일정도 늦어질 것이라고 그는 설명했습니다.

본문
2026년 10월 23일 C++26 국제표준안은 DIS 표결에서 필요한 3분의 2 찬성을 얻지 못했습니다. DIS는 ISO·IEC 공동기술위원회 JTC1의 Enquiry 단계로, 국가 회원기구들이 국제표준 초안을 검토하고 표결합니다. 이번 표결을 통과하지 못한 C++26 초안은 국제표준으로 출판되지 않았습니다. WG21 위원이며 동료들과 함께 독일의 표결을 대표한다고 밝힌 Andreas Fertig는 11월 3일 개인 블로그에서 여러 국가기구가 Contracts를 표준에 넣기에는 준비가 덜 됐다고 본 점을 표결의 쟁점으로 꼽았습니다.
Contracts는 문서에 자연어로 적던 함수 계약의 일부를 코드 단언으로 표현하는 기능입니다. 2025년 WG21 제안서 P2900R14는 함수 호출 전에 확인하는 사전조건, 함수가 정상 반환할 때 확인하는 사후조건, 함수 내부에서 실행하는 단언문을 제안합니다. 사전조건은 호출자가 만족해야 할 조건이고, 사후조건은 함수 구현자가 정상 반환 시 지켜야 할 조건입니다. 제안서는 계약 단언이 전체 계약을 자동으로 검사하는 것은 아니라고 설명합니다.
계약 단언으로 확인할 수 있는 범위는 조건마다 다릅니다. 이진 탐색에 전달한 범위가 정렬됐는지 실행 중 확인하면 알고리즘의 복잡도 보장을 해칠 수 있습니다. 두 포인터가 유효한 범위를 나타내는지 확인하려면 추가 계측이 필요할 수 있습니다. 제안서는 계약 단언이 보통 계약의 일부만 검사할 수 있어 전체 계약 준수나 프로그램의 정확성을 증명하지 못한다고 설명합니다. 또 계약 단언을 일반 입력 검증·오류 처리·제어 흐름의 대용으로 쓰는 기능으로 규정하지 않습니다. 제안서는 계약 위반을 대개 코드 버그로 보고, 실행 중 복구 가능한 오류와 구별합니다.
단언의 평가 방식은 ignore, observe, enforce, quick-enforce 네 가지입니다. ignore는 조건을 평가하지 않습니다. observe와 enforce는 위반 시 위반 처리기를 호출하며, 처리기가 정상적으로 반환하면 observe는 실행을 계속하고 enforce는 프로그램을 종료합니다. quick-enforce는 처리기를 호출하지 않고 즉시 종료합니다. 각 단언 평가에 어떤 방식을 적용할지는 구현이 정합니다. 따라서 Contracts 제안은 조건을 적는 문법뿐 아니라 평가 시점과 위반 처리 방식도 규정합니다.
표결 대상은 Contracts 조항 하나가 아니라 이 기능을 포함한 C++26 표준 초안 전체였습니다. Fertig에 따르면 Contracts는 2019년 C++20 회의에서 다른 형태로 포함됐다가 같은 회의에서 삭제됐습니다. 이후 2020년부터 약 2024년까지 관련 내용을 다루는 연구 그룹이 활동했고, 제안은 언어 확장을 맡는 EWG에서 여러 회의에 걸쳐 논의된 뒤 다수결로 C++26에 포함됐습니다. 2026년 3월 WG21도 Contracts가 들어간 초안을 큰 다수로 다음 표준화 단계에 보냈습니다. 그러나 10월 국가기구 표결에서는 필요한 찬성 비율을 얻지 못했습니다.
Fertig는 기능 설계에 대한 이견과 함께 표준화 절차에 대한 자신의 견해도 밝혔습니다. 그의 회고에 따르면 국가기구들은 새 정보가 나오거나 절차상 문제가 확인됐을 때 반대표를 던지는 것이 기존 관행이었습니다. 이번에 C++26에서 Contracts를 빼려는 국가기구들도 새 정보가 있다고 주장했지만, Fertig는 새 문서가 오래된 논거를 되풀이한다면 자신에게는 새로운 정보로 보기 어렵다고 썼습니다. 그는 이번 표결이 합의 절차에 대한 신뢰를 흔들었다고 설명했습니다.
Fertig가 열거한 후속 경로는 네 가지입니다. 수정한 초안을 다시 DIS 표결에 올리거나, 수정안을 위원회 단계인 CD로 보내거나, 기술 명세(TS)로 발행하거나, 프로젝트를 취소하는 방안입니다. 그는 어느 경로든 WG21의 다수 지지가 필요하고 차기 C++ 표준 일정도 늦어질 것이라고 썼습니다. 프로젝트를 취소하면 C++26 초안에 포함된 기능이 C++29에 자동으로 넘어가지는 않습니다. Fertig는 취소 시 C++23으로 돌아가 변경 없이 C++29를 진행하는 셈이라고 이해한다고 밝혔으며, 기능을 다시 반영하려면 이를 뒷받침할 제안서와 지지자가 필요해 일부가 빠질 수 있다고 우려했습니다.
다음 ISO C++ 회의는 2026년 11월 16일부터 21일까지 브라질 부지우스에서 열릴 예정입니다. Fertig는 교착을 푸는 일이 이 회의의 우선 과제가 될 것이라고 썼습니다. 그가 11월 3일 글을 쓸 당시 다음 표준화 경로는 정해지지 않았습니다.
자료: Andreas Fertig's Blog / 정리·해설: Trawling