개발자로/Cpp

Cpp, constexpr

ReasonyB 2024. 4. 16. 00:59

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를 요구하진 않는다.