Una plantilla de variable define una familia de variables o miembros de datos estáticos.
Sintaxis
|
|
template
<
lista-de-parámetros
>
declaración-de-variable
|
(1)
|
|
|
|
template
<
lista-de-parámetros
>
requires
restricción
declaración-de-variable
|
(2)
|
(since C++20)
|
|
|
Explicación
Una variable instanciada a partir de una plantilla de variable se denomina
variable instanciada
. Un miembro de datos estático instanciado a partir de una plantilla de miembro de datos estático se denomina
miembro de datos estático instanciado
.
Una plantilla de variable puede ser introducida por una declaración de plantilla en el ámbito de espacio de nombres, donde
variable-declaration
declara una variable.
template<class T>
constexpr T pi = T(3.1415926535897932385L); // plantilla de variable
template<class T>
T circular_area(T r) // plantilla de función
{
return pi<T> * r * r; // pi<T> es una instanciación de plantilla de variable
}
Cuando se utiliza en el ámbito de clase, la plantilla de variable declara una plantilla de miembro de datos estático.
using namespace std::literals;
struct matrix_constants
{
template<class T>
using pauli = hermitian_matrix<T, 2>; // plantilla de alias
template<class T> // plantilla de miembro de datos estático
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}};
};
Al igual que con otros
miembros estáticos
, puede ser necesaria una definición de una plantilla de miembro de datos estático. Dicha definición se proporciona fuera de la definición de la clase. Una declaración de plantilla de un miembro de datos estático en el ámbito del espacio de nombres también puede ser una definición de un
miembro de datos no plantilla de una plantilla de clase
:
struct limits
{
template<typename T>
static const T min; // declaración de una plantilla de miembro de datos estático
};
template<typename T>
const T limits::min = { }; // definición de una plantilla de miembro de datos estático
template<class T>
class X
{
static T s; // declaración de un miembro de datos estático no plantilla de una plantilla de clase
};
template<class T>
T X<T>::s = 0; // definición de un miembro de datos no plantilla de una plantilla de clase
A menos que una variable template haya sido
explícitamente especializada
o explícitamente instanciada, se instancia implícitamente cuando una especialización de la variable template se referencia en un contexto que requiere
que exista una definición de variable
o si la existencia de la definición afecta la semántica del programa, es decir, si la variable es
necesaria para evaluación constante
por una expresión (la definición puede no ser utilizada).
La existencia de una definición de una variable se considera que afecta la semántica del programa si la variable es necesaria para la evaluación constante por una expresión, incluso si la evaluación constante de la expresión no es requerida o si la evaluación de expresión constante no utiliza la definición.
Notas
Hasta que las plantillas de variables fueron introducidas en C++14, las variables parametrizadas típicamente se implementaban como miembros de datos estáticos de plantillas de clases o como plantillas de funciones constexpr que devolvían los valores deseados.
Las plantillas de variables no pueden utilizarse como
argumentos de plantilla de plantilla
.
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
|
DR
|
Aplicado a
|
Comportamiento publicado
|
Comportamiento correcto
|
|
CWG 2255
|
C++14
|
no estaba claro si una especialización de una plantilla de
miembro de datos estático es un miembro de datos estático
|
lo es
|