constexpr는 변수, 함수, 클래스를 컴파일 타임에 정수로 사용할 수 있도록 해줍니다. 즉 상수로
취급할 수 있는 작업은 컴파일 타임에 처리하도록 할 수 있습니다.
constexpr를 변수에 사용
이것은
와 같은 의미를 가집니다.
그러나 아래와 같이는 사용할 수 없습니다.
int input_num = 0;
constexpr int aa = input_num; // 에러
constexpr로 지정된 변수는 꼭 컴파일 시에 정수가 되기 때문에 변수 선언 시 대입이 정수 식이어야만 합니다. const와의 차이는 const는 컴파일 시에 정수가 아니어도 괜찮고 변수 선언 시 대입 값이 정수 식인 경우 정수 식이 되고, 그렇지 않은 경우는 단순히 const를 수식하는 것이 됩니다(이에 비해 constexpr는 꼭 정수 식이어야만 합니다).
constexpr를 함수에 사용
C++03에서는 아래의 코드는 에러가 됩니다.
int GetNum() { retun 5; }
int Numbers[ GetNum() ];
GetNum 함수는 상수 5를 반환 하는 것으로 이미 컴파일 시에 반환 값을 알 수 있습니다. 그러나 컴파일러는 GetNum 이라는 함수가 정수처럼 사용할 수 있는지 알 수 없으므로 정수로 취급하지 않습니다.
위 코드는 C++11의 constexpr를 사용하면 우리가 원하는 대로 GetNum 함수를 정수로 사용할 수 있습니다.
constexpr int GetNum() { retun 5; }
int Numbers[ GetNum() ];
constexpr를 함수에 사용할 때는 꼭 함수 본체는 { return expression; } 형태가 되어야만 합니다.
constexpr 변수는 비 constexpr 변수에 사용할 수 있으므로 아래와 같은 테크닉도 사용할 수 있다.
constexpr double power( double x, unsigned int y )
{
return y == 1 ? x : x * power( x, y - 1 ) ;
}
int main()
{
// 정수 식
constexpr double a = power( 2, 32 ) ;
// 정수 식이 아니다
double x = 2 ; unsigned int y = 32 ;
double b = power( x, y ) ;
}
(출처) http://cpplover.blogspot.com/2010/11/gccniconstexpr.html
그리고
const int base_HP = 200;
…
int NPC_Lv1_HP = base_HP + 0;
int NPC_Lv2_HP = base_HP + 200;
라는 코드는 정수 계산을 하는데 실행 시에 계산되는데 이것을 constexpr을 사용하여 컴파일 시에 계산되게 할 수 있습니다.
constexpr int AssignHP( int nPlusHP )
{
return base_HP + nPlusHP;
}
int NPC_Lv1_HP = AssignHP( 0 );
int NPC_Lv2_HP = AssignHP( 200 );
'C++0x' 카테고리의 다른 글
[미리 보는 C++11] 8. Placement Insert (0) | 2012.02.27 |
---|---|
[미리 보는 C++11] 4. constexpr - 2 (0) | 2011.09.23 |
[미리 보는 C++11] 2. override와 final (3) | 2011.08.30 |
[미리 보는 C++11] 1. UTF-8, UTF-16(char_16t), UTF-32(char32_t) 문자형 (7) | 2011.08.22 |
C++0x가 드디어 C++11이 되었습니다. (0) | 2011.08.15 |