-
constexpr 변수란?언어/C, C++ 2025. 2. 17. 23:16
constexpr 선언을 사용해 변수가 상수 표현식인지 컴파일러에서 확인할 수 있다.
constexpr 로 선언한 변수는 암시적으로 const이므로 상수 표현식으로 초기화해야 한다.
constexpr int mf = 20; // 20은 상수 표현식 constexpr int limit = mf + 1; // mf + 1은 상수 표현식 constexpr int sz = size(); // size가 constexpr 함수일 때만 좋음
일반적으로 상수 표현식으로 쓰려는 변수는 constexpr을 사용하는 것이 좋다.
상수 표현식은 컴파일 중에 평가할 수 있으므로 constexpr 선언에 쓸 수 있는 타입은 제한적이다.
constexpr에 쓸 수 있는 타입을 상수 타입이라고 하는데 상수 값을 담을 만큼 간단하다.이때 산술, 참조자, 포인터 타입이 상수 타입이라고 볼 수 있다.
포인터와 참조자 모두 constexpr로 정의할 수 있지만 초기화하는 데 사용하는 객체는 엄격히 제한된다.
constexpr 포인터는 상수 nullptr이나 상수 0으로 초기화할 수 있으며, 고정 주소에 위치한 객체도 가리키거나 결합할 수 있다.
함수 안에서 정의한 변수는 보통 고정 주소에 저장하지 않으므로 constexpr 포인터로 이런 변수를 가리킬 수 없다.
반면, 함수 바깥에서 정의한 객체의 주소는 상수 표현식이므로 constexpr 포인터를 초기화 하는 데 쓸 수 있다.
const int* p = nullptr; // p는 const int에 대한 포인터 constexpr int* q = nullptr; // q는 int에 대한 const 포인터 constexpr int* np = nullptr; // np는 int에 대한 상수 포인터이며 값은 null int j = 0; constexpr int i = 42; // i의 타입은 const int constexpr const int* pp = &i; // pp는 const int i에 대한 상수 포인터 constexpr int* pp1 = &j; // pp1은 int j에 대한 상수 포인터
constexpr 선언에서 포인터를 정의하게되면 constexpr 지정자는 포인터에 적용한다.
p와 q는 서로 다른데 p는 const에 대한 포인터고 q는 상수인 포인터이다.
constexpr 은 정의하는 객체에 상위 const를 적용한다는 점은 중요한 차이점이다.
constexpr 포인터도 상수인 포인터처럼 const나 const가 아닌 타입을 가리킬 수 있다.
constexpr(C++) | Microsoft Learn
constexpr(C++)
C++ 언어 constexpr 키워드에 대한 안내.
learn.microsoft.com
씹어먹는 C++ - <16 - 2. constexpr 와 함께라면 컴파일 타임 상수는 문제없어>
씹어먹는 C++ - <16 - 2. constexpr 와 함께라면 컴파일 타임 상수는 문제없어>
constexpr 을 통해 컴파일 타임 상수인 객체를 선언할 수 있다. const 와 constexpr 은 다르다. const 는 컴파일 타임에 상수일 필요가 없다! (const 인 애들 중에서 constexpr 이 있다고 생각하면 된다) constexpr
modoocode.com
'언어 > C, C++' 카테고리의 다른 글
decltype 타입 지정자란? (0) 2025.02.18 [C++] Vector STL (0) 2021.07.18 [C++] Queue STL (0) 2021.07.17 [C++] Stack STL (0) 2021.07.17 [C++] List STL (0) 2021.07.16