일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- gui
- a tour of go
- 프로그래밍
- JUCE
- 코딩
- go channel
- C++ gui
- 리듬게임
- JUCE라이브러리
- C++ library
- C++ gui 라이브러리
- LOB
- c++ heap
- BOJ
- 알고리즘
- Nebula
- 백준
- JUCE library
- 공룡책
- 연결리스트
- C언어
- 운영체제
- OS
- C++
- 자료구조
- tour of go
- go
- Docker
- vim-go
- JUCE 튜토리얼
- Today
- Total
CafeM0ca
[C++] constexpr 본문
상수표현식. 상수값이 요구되는 곳에 상수 표현식을 사용한다.
다음 코드는 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의 바디가 가지는 요구 사항을 똑같이 만족해야 한다.
- 모든 데이터 멤버는 상수 표현식으로 초기화되어야 한다.
예제 코드
'Programming > C++' 카테고리의 다른 글
[JUCE] 맵 컴포넌트가 안보이는데? (컴포넌트 레이아웃 배치순서) (0) | 2018.07.16 |
---|---|
[C++] unifrom initializing (0) | 2018.07.13 |
[C++] rvalue reference(우측값) (0) | 2018.07.09 |
[C++]상속 (virtual, override, static) (0) | 2018.06.30 |
[C++] pimpl(pointer to implementation) (0) | 2018.06.30 |