728x90

1. consteval 정의

  • 즉시 함수를 생성하는 지정자, 해당 함수가 컴파일 시점에 평가된다.

2. consteval 사용 방법

  • 소멸자, 메모리 할당, 재할당 함수에는 consteval를 적용할 수 없다.
  • 하나의 함수 선언에 consteval과 constexpr, constinit 중 하나만 사용할 수 있다.
  • consteval 지정자가 붙은 함수는 암묵적으로 인라인 함수가 되며, constexpr 함수의 요구 조건이 충족돼야 한다.
// consteval 지정자를 사용한 즉시 함수 
consteval int Add( int InA, int InB )
{
    return InA + InB;
}

int main()
{
    // 상수 표현식 사용
    std::cout << Add( 10, 20 ) << std::endl;

    // const 상수 표현식 사용
    const int a = 10;
    std::cout << Add( a, 20 ) << std::endl;

    // 비상수 사용
    int b = 20;
    std::cout << Add( 10, b ) << std::endl;
}

3. constexpr 허용된 조건

  • 조건부 점프 문과 반복 문
  • 하나 이상의 문장
  • constexpr 함수 호출, consteval 함수는 오직 constexpr 함수만 호출할 수 있다. ( 컴파일 시점에 확인 가능한 함수 )
  • 상수 표현식으로 초기화한 기본 형식의 변수.

4. constexpr 허용되지 않는 조건

  • static 변수와 thread_local 변수
  • try 블록과 goto 문
  • none consteval 함수의 호출, none constexpr 변수의 사용

 

5. constinit 정의

  • 변수가 컴파일 시점에 초기화 되도록 하는 지정자.
  • 정적 저장 기간, 스레드 저장 기간에 constinit을 붙인다고 해서 상수 변수가 되는 것은 아니니 유의하자!

6. constinit 사용 방법

  • 전역 변수, 정적 변수, 정적 클래스 멤버 등 저장 기간이 정적인 변수( static 변수 )에 사용 가능하다.
  • 스레드 지역 변수에 사용 가능 하다.
// consteval 지정자를 사용한 즉시 함수 
consteval int Add( int InA, int InB )
{
    return InA + InB;
}

constexpr auto ResultA = Add( 10, 20 );
constinit auto ResultB = Add( 10, 20 );

int main()
{
    // 정적 기간 변수 사용
    std::cout << ResultA << std::endl;
    std::cout << ResultB << std::endl;

    // 스레드 지역 변수 사용
    constinit thread_local auto resultC = Add( 10, 20 );
    std::cout << resultC << std::endl;
}
반응형

'C++ > C++ 20' 카테고리의 다른 글

[C++ 20] std::span  (0) 2022.02.25
[C++ 20] 템플릿 람다  (0) 2022.02.23
[C++20] 지명 초기화  (0) 2022.02.22
[C++ 20] 삼항 연산자 <=>  (0) 2022.02.20
[C++ 20] 모듈 ( Module )  (0) 2022.02.20

+ Recent posts