consteval
specifier
(since C++20)
| General topics | ||||||||||||||||
| Flow control | ||||||||||||||||
| Conditional execution statements | ||||||||||||||||
| Iteration statements (loops) | ||||||||||||||||
|
||||||||||||||||
| Jump statements | ||||||||||||||||
| Functions | ||||||||||||||||
| Function declaration | ||||||||||||||||
| Lambda function expression | ||||||||||||||||
inline
specifier
|
||||||||||||||||
| Dynamic exception specifications ( until C++17* ) | ||||||||||||||||
noexcept
specifier
(C++11)
|
||||||||||||||||
| Exceptions | ||||||||||||||||
| Namespaces | ||||||||||||||||
| Types | ||||||||||||||||
| Specifiers | ||||||||||||||||
|
||||||||||||||||
| Storage duration specifiers | ||||||||||||||||
| Initialization | ||||||||||||||||
| Expressions | ||||||||||||||||
| Alternative representations | ||||||||||||||||
| Literals | ||||||||||||||||
| Boolean - Integer - Floating-point | ||||||||||||||||
| Character - String - nullptr (C++11) | ||||||||||||||||
| User-defined (C++11) | ||||||||||||||||
| Utilities | ||||||||||||||||
| Attributes (C++11) | ||||||||||||||||
| Types | ||||||||||||||||
typedef
declaration
|
||||||||||||||||
| Type alias declaration (C++11) | ||||||||||||||||
| Casts | ||||||||||||||||
| Memory allocation | ||||||||||||||||
| Classes | ||||||||||||||||
| Class-specific function properties | ||||||||||||||||
|
||||||||||||||||
| Special member functions | ||||||||||||||||
|
||||||||||||||||
| Templates | ||||||||||||||||
| Miscellaneous | ||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-
-
consteval- 함수가 즉시 실행 함수 임을 지정합니다. 즉, 함수에 대한 모든 호출은 컴파일 타임 상수를 생성해야 합니다.
-
목차 |
설명
consteval
지정자는 함수 또는 함수 템플릿을
즉시 함수(immediate function)
로 선언합니다. 즉, 함수에 대한 모든
잠재적으로 평가되는(potentially-evaluated)
호출은 (직접적 또는 간접적으로) 컴파일 타임
상수 표현식(constant expression)
을 생성해야 합니다.
즉시 실행 함수는 경우에 따라 요구 사항에 따라
constexpr 함수
입니다.
constexpr
와 마찬가지로
consteval
지정자는
inline
을 암시합니다. 그러나 이는 소멸자, 할당 함수 또는 할당 해제 함수에 적용될 수 없습니다.
함수 또는 함수 템플릿 선언에서
consteval
을 지정하는 경우
constexpr
도 함께 지정할 수 없으며, 해당 함수 또는 함수 템플릿의 모든 재선언 역시
consteval
을 지정해야 합니다.
가장 안쪽의 비블록 범위가 즉시 함수의 잠재적으로 평가되는 호출이며 함수 매개변수 범위 가 아닌 즉시 함수의 또는 consteval if 문 의 참 분기 (C++23부터) 는 상수 표현식을 생성해야 합니다; 이러한 호출은 즉시 호출 로 알려져 있습니다.
consteval int sqr(int n) { return n*n; } constexpr int r = sqr(100); // 정상 int x = 100; int r2 = sqr(x); // 오류: 호출이 상수를 생성하지 않음 consteval int sqrsqr(int n) { return sqr(sqr(n)); // 이 시점에서 상수 표현식이 아니지만 정상 } constexpr int dblsqr(int n) { return 2 * sqr(n); // 오류: 포함 함수가 consteval이 아니며 // sqr(n)이 상수가 아님 }
식별자 표현식 이 즉시 함수를 나타내는 경우, 즉시 호출의 하위 표현식 내부 또는 즉시 함수 문맥 (즉, 위에서 언급한 즉시 함수 호출이 상수 표현식일 필요가 없는 문맥) 내에서만 나타날 수 있습니다. 즉시 함수에 대한 포인터나 참조는 취할 수 있지만 상수 표현식 평가를 벗어날 수 없습니다:
consteval int f() { return 42; } consteval auto g() { return &f; } consteval int h(int (*p)() = g()) { return p(); } constexpr int r = h(); // 정상 constexpr auto e = g(); // 잘못된 형식: 즉시 실행 함수에 대한 포인터는 // 상수 표현식의 허용된 결과가 아님
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_consteval
|
201811L
|
(C++20) | 즉시 실행 함수 |
202211L
|
(C++23)
(DR20) |
consteval 상향 전파 |
키워드
예제
#include <iostream> // 이 함수는 입력값이 컴파일 타임에 알려진 경우 컴파일 타임에 평가될 수 있습니다. // 그렇지 않으면 런타임에 실행됩니다. constexpr unsigned factorial(unsigned n) { return n < 2 ? 1 : n * factorial(n - 1); } // consteval을 사용하면 함수가 컴파일 타임에 평가되도록 강제합니다. consteval unsigned combination(unsigned m, unsigned n) { return factorial(n) / factorial(m) / factorial(n - m); } static_assert(factorial(6) == 720); static_assert(combination(4, 8) == 70); int main(int argc, const char*[]) { constexpr unsigned x{factorial(4)}; std::cout << x << '\n'; [[maybe_unused]] unsigned y = factorial(argc); // OK // unsigned z = combination(argc, 7); // 오류: 'argc'는 상수 표현식이 아닙니다 }
출력:
24
참고 항목
constexpr
지정자
(C++11)
|
변수나 함수의 값을 컴파일 시간에 계산할 수 있음을 지정함 |
constinit
지정자
(C++20)
|
변수가 정적 초기화를 가짐을 단언함, 즉 영 초기화 와 상수 초기화 |
| 상수 표현식 | 컴파일 시간에 평가될 수 있는 표현식 을 정의함 |