Namespaces
Variants

Variable template (since C++14)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

변수 템플릿은 변수 또는 정적 데이터 멤버들의 패밀리를 정의합니다.

목차

구문

template < parameter-list > variable-declaration (1)
template < parameter-list > requires constraint variable-declaration (2) (since C++20)
variable-declaration - 변수의 선언 . 선언된 변수 이름은 템플릿 이름이 됩니다.
parameter-list - 비어 있지 않은 쉼표로 구분된 템플릿 매개변수 목록으로, 각 매개변수는 상수 매개변수 , 타입 매개변수 , 템플릿 매개변수 , 또는 이들 중 하나의 매개변수 팩 입니다.
constraint - 이 변수 템플릿이 허용하는 템플릿 매개변수를 제한하는 제약 조건 표현식

설명

변수 템플릿으로부터 인스턴스화된 변수를 인스턴스화된 변수 라고 합니다. 정적 데이터 멤버 템플릿으로부터 인스턴스화된 정적 데이터 멤버를 인스턴스화된 정적 데이터 멤버 라고 합니다.

변수 템플릿은 네임스페이스 범위에서 템플릿 선언으로 도입될 수 있으며, 여기서 variable-declaration 은 변수를 선언합니다.

template<class T>
constexpr T pi = T(3.1415926535897932385L); // 변수 템플릿
template<class T>
T circular_area(T r) // 함수 템플릿
{
    return pi<T> * r * r; // pi<T>는 변수 템플릿 인스턴스화입니다
}

클래스 범위에서 사용될 때, 변수 템플릿은 정적 데이터 멤버 템플릿을 선언합니다.

using namespace std::literals;
struct matrix_constants
{
    template<class T>
    using pauli = hermitian_matrix<T, 2>; // 별칭 템플릿
    template<class T> // 정적 데이터 멤버 템플릿
    static constexpr pauli<T> sigmaX = {{0, 1}, {1, 0}};
    template<class T>
    static constexpr pauli<T> sigmaY = {{0, -1i}, {1i, 0}};
    template<class T>
    static constexpr pauli<T> sigmaZ = {{1, 0}, {0, -1}};
};

다른 static 멤버 와 마찬가지로, static 데이터 멤버 템플릿의 정의가 필요할 수 있습니다. 이러한 정의는 클래스 정의 외부에서 제공됩니다. 네임스페이스 범위에서의 static 데이터 멤버에 대한 템플릿 선언은 클래스 템플릿의 비템플릿 데이터 멤버 의 정의일 수도 있습니다:

struct limits
{
    template<typename T>
    static const T min; // 정적 데이터 멤버 템플릿의 선언
};
template<typename T>
const T limits::min = { }; // 정적 데이터 멤버 템플릿의 정의
template<class T>
class X
{
    static T s; // 클래스 템플릿의 비템플릿 정적 데이터 멤버 선언
};
template<class T>
T X<T>::s = 0; // 클래스 템플릿의 비템플릿 데이터 멤버 정의

변수 템플릿이 명시적으로 특수화 되거나 명시적으로 인스턴스화되지 않는 한, 변수 템플릿의 특수화가 변수 정의의 존재를 요구하는 컨텍스트에서 참조되거나 정의의 존재가 프로그램의 의미에 영향을 미치는 경우, 즉 변수가 표현식에 의한 상수 평가에 필요한 경우(정의가 사용되지 않을 수 있음) 암시적으로 인스턴스화됩니다.

변수의 정의가 존재한다는 것은 해당 변수가 상수 평가를 위해 표현식에 필요할 경우, 비록 표현식의 상수 평가가 요구되지 않거나 상수 표현식 평가가 해당 정의를 사용하지 않더라도 프로그램의 의미론에 영향을 미치는 것으로 간주됩니다.

참고 사항

C++14에서 변수 템플릿이 도입되기 전까지, 매개변수화된 변수들은 일반적으로 클래스 템플릿의 정적 데이터 멤버로 구현되거나 원하는 값을 반환하는 constexpr 함수 템플릿으로 구현되었습니다.

변수 템플릿은 template template arguments 로 사용할 수 없습니다.

기능 테스트 매크로 표준 기능
__cpp_variable_templates 201304L (C++14) 변수 템플릿

결함 보고서

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
CWG 2255 C++14 정적 데이터 멤버 템플릿의 특수화가 정적 데이터 멤버인지 여부가 불분명했음 정적 데이터 멤버임