C++/C++ 특수 강좌 & 모던 C++

[C++20 특수 강좌] constexpr을 넘어선 consteval

카루-R 2022. 2. 16. 13:05
반응형

C++11인가요? constexpr 키워드를 통해 함수나 변수에 사용이 가능했습니다.

변수에 사용하면 constexpr + const 효과를 통해 컴파일 타임에 상수로 고정이 되는 역할을 했죠.

매크로를 대체할 수 있었습니다.

함수에 사용하면 inline 효과를 내고, 템플릿 메타 프로그래밍(TMP)와 같이 가독성이 떨어지는 코드를 대체할 수 있었습니다.

하지만 constexpr 함수는 문제가 있죠. inline함수처럼 프로그래머가 constexpr로 선언해도 조건에 부합하지 않으면 암묵적으로 런타임에 실행됩니다.

그런 문제를 해결하기 위해 consteval이 나왔습니다. constexpr보다 좀 더 강력한 키워드라고 보시면 됩니다.

consteval은 컴파일 타임에 표현 가능한 식이 아니면 오류를 내버립니다.

constexpr int sqr(int n) 
{ 
    return n * n;
} 

constexpr int num1 = sqr(10); // ##### 1번 ######

1번은 가능합니다. num1은 컴파일타임에 결정되어야 하는데, sqr()도 컴파일 타임 식이기 때문입니다.

consteval int sqr(int n) 
{ 
    return n * n; 
} 

constexpr int num1 = sqr(10); // ##### 2번 ######

constexpr을 consteval로 바꿨습니다. 2번도 잘 실행됩니다. sqr()에 상수 값이 전달되었습니다.

consteval int sqr(int n) 
{ 
    return n * n; 
} 

int num = 20;
int result = sqr(num);

이건 안 됩니다. num은 컴파일 타임 상수 식이 아니고, sqr도 컴파일 타임에 그 값을 예측할 수 없습니다. consteval로 실행이 불가능하니 오류를 발생시키죠. 오류를 없애려면 num을 constexpr로 만들어야 합니다. constexpr함수가 뻘짓하지 않도록 새로운 키워드가 등장했다고 보시면 될 것 같네요.

반응형