名稱空間
變體
操作

變數模板 (C++14 起)

來自 cppreference.com
< cpp‎ | 語言
 
 
C++ 語言
通用主題
流程控制
條件執行語句
if
迭代語句(迴圈)
for
範圍-for (C++11)
跳轉語句
函式
函式宣告
Lambda 函式表示式
inline 說明符
動態異常規範 (直到 C++17*)
noexcept 說明符 (C++11)
異常
名稱空間
型別
說明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
儲存期說明符
初始化
表示式
替代表示
字面量
布林 - 整型 - 浮點型
字元 - 字串 - nullptr (C++11)
使用者定義 (C++11)
工具
屬性 (C++11)
型別
typedef 宣告
類型別名宣告 (C++11)
型別轉換
記憶體分配
類特有的函式屬性
explicit (C++11)
static

特殊成員函式
模板
雜項
 
 
 
 

變數模板定義了一族變數或靜態資料成員。

目錄

[編輯] 語法

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++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
CWG 2255 C++14 尚不清楚靜態
資料成員模板的特化是否為靜態資料成員
它是