constexpr, constinit, consteval 사용 (Use of constexpr, constinit, and consteval)¶
진짜 상수를 정의하거나 상수 초기화를 보장하려면 constexpr을 사용하세요. 상수가 아닌 변수의 상수 초기화를 보장하려면 constinit을 사용하세요.
정의:
어떤 변수들은 constexpr로 선언해서 그 변수가 진짜 상수, 즉 컴파일·링크 시점에 고정된다는 것을 나타낼 수 있습니다. 어떤 함수와 생성자는 constexpr로 선언할 수 있으며, 그러면 constexpr 변수를 정의하는 데 쓸 수 있게 됩니다. 함수를 consteval로 선언하면 그 사용을 컴파일 타임으로 제한할 수 있습니다.
장점:
constexpr을 쓰면 리터럴만이 아니라 부동소수점 표현식으로 상수를 정의할 수 있고, 사용자 정의 타입의 상수를 정의할 수 있으며, 함수 호출로 상수를 정의할 수 있습니다.
단점:
무언가를 성급하게 constexpr로 표시하면, 나중에 그것을 되돌려야 할 때 이행 문제가 생길 수 있습니다. constexpr 함수와 생성자에 무엇이 허용되는지에 대한 현재의 제약 때문에, 그런 정의 안에서 알아보기 어려운 우회책을 쓰게 될 수도 있습니다.
결정:
constexpr 정의는 인터페이스의 상수 부분을 더 튼튼하게 명세할 수 있게 해 줍니다. 진짜 상수와 그 정의를 뒷받침하는 함수를 명시하는 데 constexpr을 사용하세요. consteval은 런타임에 호출되어서는 안 되는 코드에 쓸 수 있습니다. constexpr과 함께 쓸 수 있게 하려고 함수 정의를 복잡하게 만들지 마세요. 인라인을 강제할 목적으로 constexpr이나 consteval을 사용하지 마세요.
옮긴이 풀이¶
세 키워드의 역할¶
constexpr: 진짜 상수(컴파일/링크 시 고정)를 정의하거나 상수 초기화를 보장. 함수·생성자에 붙이면 그 결과를constexpr변수 정의에 쓸 수 있습니다.constinit: 변수 자체는 상수가 아니지만 초기화만은 컴파일 타임 상수 초기화임을 보장(정적 변수의 초기화 순서 문제 회피).consteval: 함수를 컴파일 타임 전용으로 제한(런타임 호출 금지).
사용 지침¶
- 진짜 상수와 그것을 지원하는 함수에는
constexpr을 쓰세요. - 런타임에 호출되면 안 되는 코드에는
consteval. - 단,
constexpr로 성급하게 표시하지 마세요 — 나중에 되돌려야 하면 이행이 어렵습니다. constexpr에 맞추려고 함수 정의를 복잡하게 비틀지 마세요.- 인라인을 강제하려는 목적으로
constexpr/consteval을 쓰지 마세요.