std::is_constant_evaluated
constexpr bool is_constant_evaluated() noexcept;
|
(C++20부터)에 정의됨 | |
함수 호출이 상수 평가 컨텍스트 내에서 발생하는지 감지합니다. 호출의 평가가 true명백히 상수 평가됨인 표현식 또는 변환의 평가 내에서 발생하면 를 반환하고, 그렇지 않으면 false을 반환합니다.
다음 변수의 초기화자가 명백히 상수 평가되는지 확인하기 위해 컴파일러는 먼저 시험 상수 평가를 수행할 수 있습니다:
- 참조 타입 또는 const로 한정된 정수형 또는 열거형 타입의 변수;
- static 및 스레드 지역 변수.
이 경우 결과에 의존하는 것은 권장되지 않습니다.
int y = 0;
const int a = std::is_constant_evaluated() ? y : 1;
// Trial constant evaluation fails. The constant evaluation is discarded.
// Variable a is dynamically initialized with 1
const int b = std::is_constant_evaluated() ? 2 : y;
// Constant evaluation with std::is_constant_evaluated() == true succeeds.
// Variable b is statically initialized with 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)
|
변수가 정적 초기화, 즉 영 초기화 와 상수 초기화 를 가짐을 단언함 |