이 키워드가 붙은 객체나 함수의 리턴 값을 컴파일 타임에 알 수 있다는 의미를 가짐
template<int N>
struct A
{
int operator()() {return N;}
}
int main()
{
constexpr int num = 3;
int arr[num];
constexpr int N = 10;
A<N> a;
std::cout << a();
constexpr int val = 10;
enum B { x = val ,y ,z}
}
어떠한 식이 상수식이라고 명시해주는 키워드
const로 정의된 상수들은 굳이 컴파일 타임에 그 값을 알 필요가 없음.
int a;
...
const int b = a;
int a;
...
constexpr int b = a; //컴파일 타임 시 a가 뭐가 올 지 모르기 때문에 오류 발생

constexpr함수에서 적용되는 제약이 동일하게 적용된다. 이 클래스는 다른 클래스를 가상 상속 받을 수 없다.
"컴파일 타임에 조건문을 평가해서 조건에 맞지 않는 코드 블록을 아예 삭제해버리는" 기능
가장 큰 차이점은 컴파일 에러 발생 여부입니다.
일반 if: 조건이 false라도 그 안의 코드가 문법적으로 틀리면 무조건 컴파일 에러가 납니다.
if constexpr: 조건이 false인 블록은 컴파일러가 아예 무시(Discard)합니다. 따라서 그 안에 말도 안 되는 코드가 있어도(템플릿 타입과 맞지 않는 등) 컴파일 에러가 나지 않습니다.
template <typename T>
void show_value(T t)
{
if constexpr (std::is_pointer<T>::value)
{
std::cout << "포인터 이다 : " << *t << std::endl;
}
else
{
std::cout << "포인터가 아니다 : " << t << std::endl;
}
}
int main()
{
int x = 3;
show_value(x);/*constexpr이 없을 경우 조건문 내 블럭을 검사하는데
이때 x가 int로 들어왔으므로 *t는 포인터가 아닌 것을
역참조 하려하기 때문에 오류가 발생한다. */
int* p = &x;
show_value(p);
return 0;
}