Skip to content

2014 06 19 constexpr 키워드

krikit edited this page Nov 26, 2014 · 2 revisions

constexpr 키워드

기존에는 배열을 선언할 때 크기를 지정하려면 반드시 상수를 사용해야 했습니다.

const int get_size() { return 100; }
int arr[get_size()];    // 오류

그러나 C++11부터는 constexpr 키워드를 이용해서 제약적으로 사용할 수 있습니다.

constexpr int get_size() { return 100; }
int arr[get_size()];    // C++11에서 가능

constexpr 함수의 제약 사항

  • constexpr으로 선언하려는 대상이 클래스의 메서드일 경우 그 메서드는 virtual로 선언될 수 없다.
  • 함수의 리턴 타입은 반드시 리터럴 타입 또는 리터럴 타입에 대한 참조여야 하며 void로 선언될 수 없다.
  • 모든 파라미터는 리터럴 타입이거나 리터럴 타입에 대한 참조여야 한다. 함수의 바디는 { return expression; }과 같은 형태여야 하며 expression 부분에는 인자가 대입되고 나서 상수 표현식이 되어야 한다. expression 부분에는 다른 constexpr 함수 호출이 들어갈 수 있다.
  • constexpr 함수가 호출될 수 있으려면 그 시점에서 함수의 전체 구현부가 컴파일러에 의해 해석된 이후여야만 한다. 즉, 일반 함수는 함수 선언부만 있는 상태에서 컴파일된 후 나중에 링크될 수 있지만 constexpr 함수는 매크로처럼 호출 이전에 구현부가 컴파일러에 이미 노출되어 있어야만 한다.

constexpr 생성자 원칙

  • 모든 생성자 인자는 리터럴 타입이거나 리터럴 타입의 참조여야 한다.
  • 생성자의 바디가 try 블록에 들어가서는 안된다.
  • 생성자 바디는 공백이어야 한다.
  • 모든 데이터 멤버는 상수 표현식으로 초기화되어야 한다.
class Rect {
 public:
  constexpr Rect(int width, int height) : _width(width), _height(height) {}
  constexpr int get_area() const { return _width * _height; }
 private:
  int _width;
  int _height;
};

int main(int argc, char** argv) {
  constexpr Rect rect(10, 100);
  int arr[rect.get_area()];

  return 0;
}

위 제약 사항들 및 클래스 예제는 마크 그레고리 외 지음, 권오인 옮김, "전문가를 위한 C++: C++11을 대하는 유쾌한 방법", 한빛미디어 출판 책으로부터 인용했습니다.

Clone this wiki locally