Namespaces
Variants

std::is_constant_evaluated

cppreference.net에서
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20부터 사용 중단)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
Swap 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
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) 변수가 정적 초기화, 즉 영 초기화 와 상수 초기화 를 가짐을 단언함