Namespaces
Variants

std:: is_constant_evaluated

From cppreference.net
Utilities library
헤더 파일에 정의됨 <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) 변수가 정적 초기화, 즉 영 초기화 상수 초기화 를 가짐을 단언함