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

Una plantilla de variable define una familia de variables o miembros de datos estáticos.

Contenidos

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)
variable-declaration - una declaración de una variable. El nombre de la variable declarada se convierte en un nombre de plantilla.
parameter-list - una lista no vacía separada por comas de los parámetros de plantilla , cada uno de los cuales es un parámetro constante , un parámetro de tipo , un parámetro de plantilla , o un paquete de parámetros de cualquiera de esos.
constraint - una expresión de restricción que restringe los parámetros de plantilla aceptados por esta plantilla de variable

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 .

Macro de prueba de características Valor Std Característica
__cpp_variable_templates 201304L (C++14) Variable templates

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