Cpp, constexpr
constexpr(C++) | Microsoft Learn
constexpr(C++)
C++ 언어 constexpr 키워드(keyword) 대한 가이드입니다.
learn.microsoft.com
constexpr의 의미: const expression의 준말.
const와 공통점은 변수들에 적용될 수 있다는 것이다. 이 변수 값을 변경하려면 컴파일 에러가 발생한다. 다른 점은 함수나 생성자(constructor)에도 적용된다는 것이다.
Return value
constexpr 변수나 함수는 literal 타입을 반환해야한다.
constexpr 변수들
- constexpr 생성자, constexpr 함수를 통해 초기화할 수 있다.
- 단, 초기화 과정에서 어떤 implicit conversion들도 const expression이어야 한다.
- 그외는 const와 동일하다.
constexpr 함수들
constexpr 함수는 필요해서 코드를 사용할 때 컴파일 동안 컴퓨트할 수 있는 반환 값을 가져야한다. 코드 사용은 컴파일할 때, constexpr 변수를 초기화하기 위해 혹은 타입 없는 템플렛 구문을 제공하기 위해 반환 값을 가져야한다. 이 구문들이 constexpr 값들이라면, constexpr 함수는 컴파일 const를 생성한다. non-constexpr 구문과 호출될 때 혹은 이 값이 컴파일을 거칠 필요가 없을 땐, 일반적인 함수처럼 런타임 중에 값을 생성한다.
- constexpr 함수나 생성자는 절대적으로 inline이다.
- constexpr 함수는 literal 타입들을 받아들이거나 리턴해야한다.
- constexpr 함수는 반복될 수 있다.
- 20전에는 어떤 추상화 클래스에 들어있는 constexpr 함수는 virtual 함수가 될 수 없었고, 생성자들은 virtual 기반 클래스에서 constexpr로 정의될 수 없었다.
- 20 이후에는 constexpr 함수는 virtual이 될수 있다. /std:c++20 or later 이라는 컴파일 옵션을 활성화 해야지만 이를 지원할 수 있다.
- 몸뚱아리(실제 정의 부분)는 = default나 =delete로 선언될 수 있다.
- 몸뚱아리는 goto 구문이나 try 블럭은 포함할 수 없다.
- non-constexpr 템플릿의 explicit specialization은 constexpr로 선언될 수 있다.
- constexpr 템플릿의 explicit specialization은 constexpr로 선언할 필요가 없다.
VS2017이후 규칙
- if, switch 그리고 모든 반복 구문을 포함하고 있을지도 모른다.
- local 변수 선언을 포함하고 있을 지도 모른다.(단, 초기화는 되어있아야 함)
- constexpr non-static 멤버 함수는 절대적인 const를 요구하진 않는다.