Eine Variablenvorlage definiert eine Familie von Variablen oder statischen Datenelementen.
Syntax
|
|
template
<
parameter-list
>
variable-declaration
|
(1)
|
|
|
|
template
<
parameter-list
>
requires
constraint
variable-declaration
|
(2)
|
(seit C++20)
|
|
|
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.
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
|