std:: is_constant_evaluated
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
헤더 파일에 정의됨
<type_traits>
|
||
|
constexpr
bool
is_constant_evaluated
(
)
noexcept
;
|
(C++20부터) | |
함수 호출이 상수 평가 컨텍스트 내에서 발생하는지 여부를 감지합니다. 호출 평가가 명백하게 상수 평가되는 표현식 또는 변환의 평가 내에서 발생하면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.
다음 변수들의 초기화가 명백하게 상수 평가되는지 판단하기 위해, 컴파일러는 먼저 시험적 상수 평가를 수행할 수 있습니다:
- 참조 타입 또는 const 한정 정수형/열거형을 가진 변수들;
- 정적 및 스레드 지역 변수.
이 경우에는 결과에 의존하는 것을 권장하지 않습니다.
int y = 0; const int a = std::is_constant_evaluated() ? y : 1; // 상수 평가 시도가 실패합니다. 상수 평가는 폐기됩니다. // 변수 a는 1로 동적으로 초기화됩니다 const int b = std::is_constant_evaluated() ? 2 : y; // std::is_constant_evaluated() == true인 상수 평가가 성공합니다. // 변수 b는 2로 정적으로 초기화됩니다
목차 |
매개변수
(없음)
반환값
true 만약 호출의 평가가 명백하게 상수 평가되는 표현식 또는 변환의 평가 내에서 발생하는 경우; 그렇지 않으면 false .
가능한 구현
// 이 구현은 C++23의 if consteval이 필요합니다. constexpr bool is_constant_evaluated() noexcept { if consteval { return true; } else { return false; } } |
참고 사항
static_assert 선언의 조건이나 constexpr if 문 에 직접 사용될 때, std :: is_constant_evaluated ( ) 는 항상 true 를 반환합니다.
C++20에는
if consteval
이 없기 때문에,
std::is_constant_evaluated
는 일반적으로 컴파일러 확장 기능을 사용하여 구현됩니다.
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_is_constant_evaluated
|
201811L
|
(C++20) |
std::is_constant_evaluated
|
예제
#include <cmath> #include <iostream> #include <type_traits> constexpr double power(double b, int x) { if (std::is_constant_evaluated() && !(b == 0.0 && x < 0)) { // 상수 평가 컨텍스트: constexpr 친화적인 알고리즘 사용 if (x == 0) return 1.0; double r {1.0}; double p {x > 0 ? b : 1.0 / b}; for (auto u = unsigned(x > 0 ? x : -x); u != 0; u /= 2) { if (u & 1) r *= p; p *= p; } return r; } else { // 코드 생성기가 처리하도록 함 return std::pow(b, double(x)); } } int main() { // 상수 표현식 컨텍스트 constexpr double kilo = power(10.0, 3); int n = 3; // 상수 표현식이 아님. n이 상수 표현식 컨텍스트에서 rvalue로 변환될 수 없기 때문 // std::pow(10.0, double(n))와 동등함 double mucho = power(10.0, n); std::cout << kilo << " " << mucho << "\n"; // (3) }
출력:
1000 1000
참고 항목
constexpr
지정자
(C++11)
|
변수나 함수의 값을 컴파일 시간에 계산할 수 있음을 지정함 |
consteval
지정자
(C++20)
|
함수가 즉시 실행 함수 임을 지정함, 즉 함수에 대한 모든 호출이 상수 평가에서 이루어져야 함 |
constinit
지정자
(C++20)
|
변수가 정적 초기화, 즉 영 초기화 와 상수 초기화 를 가짐을 단언함 |