constexpr

  • 컴파일 시간에 상수를 만드는 새로운 키워드
  • C++ 11
  • 상수의 종류
    • const int s2 = 10; // 컴파일 시간 상수
    • const int s3 = s1; // 런타임 상수
    • C99부터 배열의 크기로 변수 사용가능. g++은 지원하나 cl은 지원않으므로 cl로 테스트해보면 런타임상수 이용한 배열같은 경우 컴파일 실
  • const
    • 컴파일 시간 상수와 실행시간 상수 모두 생성가능
    • 변수값으로 초기화 가능
  • constexpr
    • const로 인한 혼란 방지
    • 컴파일 시간 상수만 생성가능. 그러므로 컴파일 시간에 계산되는 값으로만 초기화 가능
    • 템플릿 인자로 사용 가능?

structure binding

  • c++ 17
  • 구조체 또는 배열에서 각 멤버의 값을 꺼낼 때
  • 타입은 반드시 auto여야 함 (const, volatile, ref 가능)
  struct Point
{	int x{10};	int y{10};
}
int arr[2] = {1,2}
auto [x,y] = pt;
auto [z,k] = arr;
  

constexpr function

  • 의미

    • 컴파일 시간
  • constexpr 활용

    • constexpr 상수 → 이전
    • constexpr function
    • if constextpr → 추후
  • 활용

    • 함수의 인자 값을 컴파일 시간에 결정할 수 있으면 컴파일 타임에 함수를 실행
    • 안되면 런타임에 실행
      template<typename T, int N>
    struct Buffer
    {
        	T data[N];
    }
    constexpr int add(int a, int b)
    {	
        return a + b;
    }
    Buffer<int, n> b2 //error
    Buffer<int, add(1,2)> b2; // 이런 것이 가능`
      
  • 제약

    • C++11
      • 컴파일 시간에 수행되기때문에 return이 한번만 나와야 한다
    • C++14
      • 일부 제약 잔여
      • 파일을 오픈하거나 동적 메모리 할당 불가
      • 가상함수 불가

if constexpr

  • 내용
    • 컴파일 시간에 조건식을 조사
    • static if라고도 함
    • C++17
    • 보통 라이브러리 설계, 템플릿 만들 때 사용
  • 활용
    • 기본

      • if constexpr (sizeof(n) == 0)
    • 조건에 따라 특정 코드 생성방지

        template<typename T>
      void foo(T a)
      {	
          if constexpr (0) *a = 0; // 이제 ptr인지아닌지 이런 검사가 들어가는
      }