C++20

C++20 의도 선언

concept, ranges, coroutine, module은 서로 달라 보이지만 공통 목표는 같다. 더 이른 단계에서 제약을 표현하고, 더 좁은 범위만 읽게 만드는 것이다.

01

제약을 선언한다

concept으로 템플릿 본문이 기대하는 연산을 함수 선언부에서 먼저 보여 준다.

02

범위를 파이프라인으로 읽는다

ranges와 views로 필터, 변환, 제한을 데이터 흐름에 가깝게 표현한다.

03

도입 비용을 재본다

빌드 시스템, 컴파일러 버전, 팀 코드 스타일이 준비되지 않았다면 부분 적용부터 시작한다.

concepts
계약 기반 오류 템플릿 인자가 만족해야 할 조건을 이름 있는 계약으로 만든다.
SFINAE보다 읽기 쉽다.
ranges
범위 중심 알고리즘 begin/end를 직접 넘기는 대신 컨테이너나 view를 넘긴다.
lazy view의 수명에 주의한다.
coroutine
비동기 흐름 표현 co_await, co_yield로 중단 지점을 문법에 드러낸다.
프레임 수명과 allocator가 중요하다.
modules
컴파일 경계 텍스트 include보다 명시적인 interface를 제공한다.
툴체인 지원 상태를 확인한다.

부분 도입 · 수명 · 도구 점검

부분 도입 concept처럼 독립적으로 효과가 큰 기능부터 적용할 수 있는가.
수명 ranges view가 임시 객체를 참조해 dangling을 만들지 않는가.
도구 컴파일러, formatter, static analyzer, 빌드 캐시가 해당 기능을 안정적으로 지원하는가.

concept로 제약 올리기

template <typename T>
concept Addable = requires(T a, T b) { a + b; };

template <Addable T>
T add(T a, T b) { return a + b; }