Namespaces
Variants

consteval specifier (since C++20)

From cppreference.net
C++ language
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
constexpr (C++11)
consteval (C++20)
constinit (C++20)
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 상향 전파

키워드

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) 변수가 정적 초기화를 가짐을 단언함, 즉 영 초기화 상수 초기화
상수 표현식 컴파일 시간에 평가될 수 있는 표현식 을 정의함