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 |