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

Eine Variablenvorlage definiert eine Familie von Variablen oder statischen Datenelementen.

Inhaltsverzeichnis

Syntax

template < parameter-list > variable-declaration (1)
template < parameter-list > requires constraint variable-declaration (2) (seit C++20)
variable-declaration - eine Deklaration einer Variable. Der deklarierte Variablenname wird zu einem Template-Namen.
parameter-list - eine nicht-leere, kommagetrennte Liste der Template-Parameter , von denen jeder entweder ein konstanter Parameter , ein Typ-Parameter , ein Template-Parameter oder ein Parameter-Pack von diesen ist.
constraint - ein Constraint-Ausdruck , der die von diesem Variablen-Template akzeptierten Template-Parameter einschränkt

Erklärung

Eine Variable, die aus einer Variablenvorlage instanziiert wird, wird als instanziierte Variable bezeichnet. Ein statisches Datenelement, das aus einer statischen Datenelementvorlage instanziiert wird, wird als instanziertes statisches Datenelement bezeichnet.

Eine Variable Template kann durch eine Template-Deklaration im Namensbereich eingeführt werden, wobei variable-declaration eine Variable deklariert.

template<class T>
constexpr T pi = T(3.1415926535897932385L); // Variablen-Template
template<class T>
T circular_area(T r) // Funktions-Template
{
    return pi<T> * r * r; // pi<T> ist eine Variablen-Template-Instanziierung
}

Bei Verwendung im Klassenbereich deklariert eine Variablenvorlage ein statisches Datenelement-Template.

using namespace std::literals;
struct matrix_constants
{
    template<class T>
    using pauli = hermitian_matrix<T, 2>; // Alias-Template
    template<class T> // Statische Datenelementvorlage
    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}};
};

Wie bei anderen static members kann eine Definition eines static data member templates erforderlich sein. Eine solche Definition wird außerhalb der Klassendefinition bereitgestellt. Eine Template-Deklaration eines static data member im Namespace-Bereich kann auch eine Definition eines Nicht-Template data member of a class template sein:

struct limits
{
    template<typename T>
    static const T min; // Deklaration eines statischen Datenelement-Templates
};
template<typename T>
const T limits::min = { }; // Definition eines statischen Datenelement-Templates
template<class T>
class X
{
    static T s; // Deklaration eines nicht-Template statischen Datenelements einer Klassentemplate
};
template<class T>
T X<T>::s = 0; // Definition eines nicht-Template Datenelements einer Klassentemplate

Sofern eine Variablenvorlage nicht explizit spezialisiert oder explizit instanziiert wurde, wird sie implizit instanziiert, wenn eine Spezialisierung der Variablenvorlage in einem Kontext referenziert wird, der eine Variablendefinition erfordert oder wenn die Existenz der Definition die Semantik des Programms beeinflusst, d.h. wenn die Variable für konstante Auswertung benötigt wird durch einen Ausdruck (die Definition darf ungenutzt bleiben).

Die Existenz einer Definition einer Variable wird als semantikbeeinflussend für das Programm betrachtet, wenn die Variable für die Konstantenauswertung durch einen Ausdruck benötigt wird, selbst wenn die Konstantenauswertung des Ausdrucks nicht erforderlich ist oder wenn die Konstantenauswertung des Ausdrucks die Definition nicht verwendet.

Hinweise

Bis Variablenvorlagen in C++14 eingeführt wurden, wurden parametrisierte Variablen typischerweise entweder als statische Datenelemente von Klassenvorlagen oder als constexpr-Funktionsvorlagen implementiert, die die gewünschten Werte zurückgeben.

Variablen-Templates können nicht als Template-Template-Argumente verwendet werden.

Feature-Test-Makro Wert Std Funktion
__cpp_variable_templates 201304L (C++14) Variablen-Templates

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 2255 C++14 es war unklar, ob eine Spezialisierung eines static
data member template ein static data member ist
es ist