-
constexpr는 const보다 상수성을 더 강화합니다. 컴파일 타임에 상수로 평가될 수 있도록 할 수 있습니다. C++17부터는 람다식은 constexpr입니다. 다음 코드를 보면 피보나치 재귀함수의 값을 상수 시간이 계산합니다. 반홥값, 인수 모두 리터럴이어야 constexpr 함수를 사용할 수 있습니다. 다음은 value가 컴파일 타임에 값이 정해지므로 배열 객체 생성에 쓰일 수 있습니다.
constexpr int fib(int num) { return num <= 1 ? num : fib(num - 2) + fib(num - 1); } int main() { constexpr int value = fib(10); int nums[value]; }
클래스나 구조체의 경우 멤버 변수가 전부 리터럴이면 생성자는 암시적으로 constexpr입니다. 명시적으로 붙여도 됩니다. 다음을 보면 연산자 오버로딩에도 constexpr을 붙여 컴파일 타임에 값을 평가할 수 있습니다.
struct Item { int power; constexpr Item(int power) : power(power) {} // const를 붙여야 하는 이유는 Item 객체로 받을 때 // constexpr을 붙이기 때문이며 상수 객체는 const 함수만 호출할 수 있습니다 constexpr Item operator+(const Item& rhs) const { return Item(power + rhs.power); } }; int main() { constexpr Item item0(100); constexpr Item item1(200); constexpr Item item2 = item0 + item1; int nums[item2.power]; // ok }
다음은 람다식 예제입니다.
int main() { // C++17부터는 lamda는 constexpr입니다 // C++14는 constexpr을 명시적으로도 붙일 수 없습니다 // noexcept 붙일 수 있습니다 auto func = [](int x) noexcept { return x; }; int nums[func(10)]; // ok }
'개발 > C·C++' 카테고리의 다른 글
전달 참조(보편 참조) (0) 2022.01.08 RVO, NRVO (0) 2022.01.08 noexcept (0) 2022.01.06 객체 생성 시 const의 위치 차이 (0) 2022.01.04 get 함수를 const로 해야 하는 이유 (0) 2022.01.04