Spec-Zone.ru › C++

Шаблон переменной (начиная с C++14)

Шаблон переменной определяет семейство переменных или статических членов данных.

Синтаксис

template < parameter-list > variable-declaration (1)
template < parameter-list > requires constraint variable-declaration (2) (начиная с C++20)
variable-declaration - объявление переменной. Имя объявленной переменной становится именем шаблона.
parameter-list - непустой список параметров шаблона, разделённых запятыми; каждый из них является либо параметром шаблона, не являющимся типом, либо параметром типа, либо параметром шаблона, либо пакетом параметров любого из этих видов.
constraint - выражение-ограничение, ограничивающее параметры шаблона, допустимые для этого шаблона переменной

Пояснение

Переменная, инстанцированная из шаблона переменной, называется инстанцированной переменной. Статический член данных, инстанцированный из шаблона статического члена данных, называется инстанцированным статическим членом данных.

Шаблон переменной может быть объявлен объявлением шаблона в области видимости пространства имён, где variable-declaration объявляет переменную.

template<class T>
constexpr T pi = T(3.1415926535897932385L); // variable template

template<class T>
T circular_area(T r) // function template
{
    return pi<T> * r * r; // pi<T> is a variable template instantiation
}

В области видимости класса шаблон переменной объявляет шаблон статического члена данных.

using namespace std::literals;
struct matrix_constants
{
    template<class T>
    using pauli = hermitian_matrix<T, 2>; // alias template

    template<class T> // static data member template
    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}};
};

Как и для других статических членов, может потребоваться определение шаблона статического члена данных. Такое определение предоставляется вне определения класса. Объявление шаблона статического члена в области видимости пространства имён также может быть определением нешаблонного члена данных шаблона класса:

struct limits
{
    template<typename T>
    static const T min; // declaration of a static data member template
};

template<typename T>
const T limits::min = { }; // definition of a static data member template

template<class T>
class X
{
    static T s; // declaration of a non-template static data member of a class template
};

template<class T>
T X<T>::s = 0; // definition of a non-template data member of a class template

Если шаблон переменной не был явно специализирован или явно инстанцирован, он инстанцируется неявно, когда специализация шаблона переменной используется в контексте, требующем наличия определения переменной, или если наличие определения влияет на семантику программы, то есть если выражение требует переменную для константного вычисления (определение может не использоваться).

Считается, что наличие определения переменной влияет на семантику программы, если выражение требует эту переменную для константного вычисления, даже если константное вычисление выражения не требуется или если при вычислении константного выражения определение не используется.

Примечания

До появления шаблонов переменных в C++14 параметризованные переменные обычно реализовывались либо как статические члены данных шаблонов классов, либо как шаблоны функций constexpr, возвращающие требуемые значения.

Шаблоны переменных нельзя использовать в качестве аргументов шаблона-шаблона.

Макрос проверки наличия функции Значение Стандарт Функция
__cpp_variable_templates 201304L (C++14) Шаблоны переменных

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Правильное поведение
CWG 2255 C++14 было неясно, является ли специализация шаблона статического
члена данных статическим членом данных
является

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/variable_template

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API