CafeM0ca

[C++] constexpr 본문

Programming/C++

[C++] constexpr

M0ca 2018. 7. 9. 04:44
반응형

상수표현식. 상수값이 요구되는 곳에 상수 표현식을 사용한다.


다음 코드는 C++에서 오류로 처리된다.


const를 constexpr로 바꿔주면 컴파일 오류가 발생하지 않는다.

constexpr은 const와 마찬가지로 컴파일 타임에 계산된다.

constexpr을 사용하면 컴파일러가 최적화를 훨씬 효과적으로 할 수 있다. 단, 함수를 constexpr로 선언하려면 다음과 같이 꽤 많은 제약 사항을 지키자.

- 함수의 본체는 한 개의 리턴문으로 만들어져야하고 goto문이나 try/catch 블록이 포함되면 안되며 예외를 발생시켜도 안된다. 단, 다른 constexpr을 호출하는것은 허용된다.

- constexpr으로 선언하려는 대상이 클래스의 멤버 함수일 경우 그 메서드는 virtual로 선언될 수 없다.

- 모든 함수 인자는 리터럴 타입이어야한다.    // 리터럴 타입: 내장 데이터타입. e.g: int, float, char[] etc . .

- 함수의 리턴 타입은 반드시 리터럴 타입이 타입이어야하며 void로 선언할 수 없다.

- constexpr 함수가 호출될 수 있으려면 그 시점에서 함수의 전체 구현부가 컴파일러에 의해 해석된 이후여야 한다. -> 함수의 선언과 정의가 동시에 되어야한다.

- dynamic_cast와 new delete는 사용 불가능하다.


constexpr 생성자를 이용하면 내장 타입 외에 자체적으로 정의한 타입으로도 상수 표현 변수를 만들 수 있다. 다음과 같은 원칙을 따라야한다.

- 모든 생성자 인자는 리터럴 타입이어야 한다.

- 생성자의 바디가 try 블록에 들어가서는 안된다. // exception 처리를 위해 생성자 초기화 리스트를 포함한 생성자 바디를 try/catch 블록의 일부로 정의할 수 있다.

- 생성자 바디는 constexpr의 바디가 가지는 요구 사항을 똑같이 만족해야 한다.

- 모든 데이터 멤버는 상수 표현식으로 초기화되어야 한다.


예제 코드

반응형
Comments