constexpr(C++)

이 키워드(keyword) constexpr C++11에서 도입되었으며 C++14에서 개선되었습니다. ant 식을 의미합니다.const 마찬가지로 const변수에 적용할 수 있습니다. 코드에서 값을 y로 모딩if하려고 하면 컴파일러 오류가 발생합니다. 달리 const함수 constexpr 및 클래스 const럭터에도 적용할 수 있습니다. constexpr 는 값 또는 반환 값이 ant이고 const가능한 경우 컴파일 시간에 계산됨을 나타냅니다.

정수 값은 constexpr 템플릿 인수 및 배열 선언과 같이 정수가 필요한 위치에 사용할 const 수 있습니다. 또한 런타임 대신 컴파일 시간에 값을 계산하면 프로그램을 더 빠르게 실행하고 메모리를 적게 사용하는 데 도움이 됩니다.

컴파일 시간 개미 계산의 복잡성과 컴파일 시간에 const미치는 잠재적 영향을 제한하기 위해 C++14 표준에서는 ant 식의 const형식이 리터럴 형식이어야 합니다.

구문

constexprliteral-typeidentifier=constant-expression;
constexprliteral-typeidentifier{constant-expression};
constexprliteral-typeidentifier(params);
constexprctor(params);

매개 변수

params
하나 이상의 매개 변수, 각각은 리터럴 형식이어야 하며 그 자체가 ant 식이어야 const합니다.

반환 값

변수 또는 함수는 constexpr 리터럴 형식반환해야 합니다.

constexpr 변수

변수와 constexpr 변수 간의 const 기본 difference는 런타임까지 변수의 const 초기화를 지연할 수 있다는 것입니다. 변수는 constexpr 컴파일 시간에 초기화해야 합니다. 모든 constexpr 변수는 .입니다 const.

  • 변수는 리터럴 형식이 있고 초기화될 때 변수를 사용하여 constexpr선언할 수 있습니다. 초기화가 ructor에 의해 med당for인 const경우 ructor는 const.로 constexpr선언되어야 합니다.

  • 참조는 두 조건이 모두 충족될 때로 constexpr 선언될 수 있습니다. 참조된 개체는 ant 식에 의해 const초기화되고 초기화 중에 호출되는 암시적 변환도 constant 식입니다.

  • 변수 또는 함수의 constexpr 모든 선언에는 사양ifier가 constexpr 있어야 합니다.

constexpr float x = 42.0;
constexpr float y{108};
constexpr float z = exp(5, 3);
constexpr int i; // Error! Not initialized
int j = 0;
constexpr int k = j + 1; //Error! j not a constant expression

constexpr 함수

constexpr 함수는 코드를 사용해야 하는 경우 컴파일 시간에 반환 값을 계산할 수 있는 함수입니다. 코드를 사용하려면 컴파일 시 반환 값이 변수를 constexpr 초기화하거나 형식이 아닌 템플릿 인수를 제공해야 합니다. 인수가 값이면 constexpr 함수는 constexpr 컴파일 시간 constant를 생성합니다. 인수constexpr 가 아닌 인수로 호출되거나 컴파일 시간에 해당 값이 필요하지 않은 경우 런타임에 일반 함수와 같은 값을 생성합니다. (이 이중 동작을 사용하면 동일한 함수의 버전 및 비constexpr 버전을 작성 constexpr 할 필요가 없습니다.)

constexpr 함수 또는 constructor는 암시적으로 inline.

함수에는 constexpr 다음 규칙이 적용됩니다.

  • 함수는 constexpr 리터럴 형식수락하고 반환해야 합니다.

  • 함수는 constexpr 재귀적일 수 있습니다.

  • e C++20이면for함수는 constexpr 가상일 수 없으며const, 바깥쪽 클래스에 가상 기본 클래스가 있는 경우처럼 constexpr 벡터를 정의할 수 없습니다. C++20 이상에서는 함수가 가상일 constexpr 수 있습니다. Visual Studio 2019 버전 16.10 이상 버전은 y 이상 컴파일러 옵션을 사양if할 때 가상 함수를 /std:c++20 지원 constexpr 합니다.

  • 본문은 = default 또는 = delete로 정의할 수 있습니다.

  • 본문에는 문이나 try 블록이 포함될 수 없습니다goto.

  • 비 템플릿constexpr 의 명시적 특수화를 다음과 같이 constexpr선언할 수 있습니다.

  • 템플릿의 constexpr 명시적 특수화는 다음일 필요가 constexpr없습니다.

다음 규칙은 Visual Studio 2017 이상의 함수에 적용됩니다 constexpr .

  • 여기에는 명령문과switch, 범위 기반whilefor, do-while를 비롯한 for모든 루핑 문이 포함될 if 수 있습니다.

  • 지역 변수 선언을 포함할 수 있지만 변수를 초기화해야 합니다. 리터럴 형식이어야 하며 스레드 로컬일 static 수 없습니다. 로컬로 선언된 변수는 필요하지 않으며 변경될 const수 있습니다.

  • 멤버staticconstexpr 아닌 함수는 암시적으로 const사용할 필요가 없습니다.

constexpr float exp(float x, int n)
{
    return n == 0 ? 1 :
        n % 2 == 0 ? exp(x * x, n / 2) :
        exp(x * x, (n - 1) / 2) * x;
}

Visual Studio 디버거에서 최적화되지 않은 디버그 빌드를 디버깅할 때 중단점을 내부에 배치하여 컴파일 시간에 함수가 평가되고 있는지 여부를 constexpr 알 수 있습니다. 중단점을 적중할 경우 함수가 런타임에 호출되었습니다. 그렇지 않을 경우 함수가 컴파일 타임에 호출되었습니다.

Extern constexpr

/Zc:externConstexpr 컴파일러 옵션을 사용하면 컴파일러가 externconstexpr을 사용하여 선언된 변수에 외부 연결을 적용합니다. 이전 버전의 Visual Studio에서 기본적으로 또는 /Zc:externConstexpr-가 사양ified인 경우 Visual Studio는 키워드(keyword) 사용하는 경우에도 extern 변수에 constexpr 내부 연결을 적용합니다. /Zc:externConstexpr 옵션은 Visual Studio 2017 업데이트 15.6부터 사용할 수 있으며 기본적으로 꺼져 있습니다. /permissive- 옵션은 /Zc:externConstexpr을 사용하도록 설정하지 않습니다.

예시

다음 예제에서는 변수, 함수 및 사용자 정의 형식을 보여 constexpr 줍니다. 마지막 문에서 main()constexpr 멤버 함수 GetValue() 는 컴파일 시간에 값을 알 필요가 없으므로 런타임 호출입니다.

// constexpr.cpp
// Compile with: cl /EHsc /W4 constexpr.cpp
#include <iostream>

using namespace std;

// Pass by value
constexpr float exp(float x, int n)
{
    return n == 0 ? 1 :
        n % 2 == 0 ? exp(x * x, n / 2) :
        exp(x * x, (n - 1) / 2) * x;
}

// Pass by reference
constexpr float exp2(const float& x, const int& n)
{
    return n == 0 ? 1 :
        n % 2 == 0 ? exp2(x * x, n / 2) :
        exp2(x * x, (n - 1) / 2) * x;
}

// Compile-time computation of array length
template<typename T, int N>
constexpr int length(const T(&)[N])
{
    return N;
}

// Recursive constexpr function
constexpr int fac(int n)
{
    return n == 1 ? 1 : n * fac(n - 1);
}

// User-defined type
class Foo
{
public:
    constexpr explicit Foo(int i) : _i(i) {}
    constexpr int GetValue() const
    {
        return _i;
    }
private:
    int _i;
};

int main()
{
    // foo is const:
    constexpr Foo foo(5);
    // foo = Foo(6); //Error!

    // Compile time:
    constexpr float x = exp(5, 3);
    constexpr float y { exp(2, 5) };
    constexpr int val = foo.GetValue();
    constexpr int f5 = fac(5);
    const int nums[] { 1, 2, 3, 4 };
    const int nums2[length(nums) * 2] { 1, 2, 3, 4, 5, 6, 7, 8 };

    // Run time:
    cout << "The value of foo is " << foo.GetValue() << endl;
}

요구 사항

Visual Studio 2015 이상 -

참고 항목

선언 및 정의
const