ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • constexpr
    개발/C·C++ 2022. 1. 6. 21:53

    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

    댓글

Designed by Tistory.