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형식이 리터럴 형식이어야 합니다.
구문
constexpr
literal-typeidentifier=constant-expression;
constexpr
literal-typeidentifier{constant-expression};
constexpr
literal-typeidentifier(params);
constexpr
ctor(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
, 범위 기반while
for
, do-while를 비롯한for
모든 루핑 문이 포함될if
수 있습니다.지역 변수 선언을 포함할 수 있지만 변수를 초기화해야 합니다. 리터럴 형식이어야 하며 스레드 로컬일
static
수 없습니다. 로컬로 선언된 변수는 필요하지 않으며 변경될const
수 있습니다.멤버
static
가constexpr
아닌 함수는 암시적으로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 이상 -
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기