變數模板 (C++14 起)
來自 cppreference.com
變數模板定義了一族變數或靜態資料成員。
目錄 |
[編輯] 語法
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 | 尚不清楚靜態 資料成員模板的特化是否為靜態資料成員 |
它是 |