超程式設計庫 (C++11 起)
C++ 提供超程式設計功能,例如型別特性、編譯時有理算術和編譯時整數序列。
目錄 |
[編輯] 定義
以下型別統稱為可引用型別
對於任何可引用型別 T
,都可以建立其引用[1]。
[編輯] 型別特性
型別特性定義了編譯時基於模板的介面,用於查詢型別的屬性。
嘗試特化在 <type_traits> 標頭檔案中定義並在此頁中列出的模板會導致未定義行為,除非 std::common_type 和 std::basic_common_reference(C++20 起)可以根據描述的要求進行特化。
在 <type_traits> 標頭檔案中定義的模板可以用不完整型別例項化,除非另有規定,儘管通常禁止用不完整型別例項化標準庫模板。
[編輯] 基類
大多數非轉換型別特性需要公開且明確地派生自 std::integral_constant,以滿足 UnaryTypeTrait 或 BinaryTypeTrait 的要求。
定義於標頭檔案
<type_traits> | |
(C++11)(C++17) |
指定型別和指定值的編譯時常量 (類模板) |
提供了 std::integral_constant 的兩個特化,用於型別 bool
定義於標頭檔案
<type_traits> | |
型別 | 定義 |
true_type
|
std::integral_constant<bool, true> |
false_type
|
std::integral_constant<bool, false> |
[編輯] 一元型別特性
一元型別特性可用於在編譯時查詢型別的布林屬性。
所有這些型別特性都滿足 UnaryTypeTrait,每個型別特性的基本特性要麼是 std::true_type,要麼是 std::false_type,具體取決於是否滿足相應的條件。
主要型別類別 (Primary type categories) | |
定義於標頭檔案
<type_traits> | |
(C++11) |
檢查型別是否為 void (類模板) |
(C++11)(DR*) |
檢查型別是否為 std::nullptr_t (類模板) |
(C++11) |
檢查型別是否為整型 (類模板) |
(C++11) |
檢查型別是否為浮點型別 (類模板) |
(C++11) |
檢查型別是否為陣列型別 (類模板) |
(C++11) |
檢查一個型別是否是列舉型別 (類模板) |
(C++11) |
檢查型別是否為聯合型別 (類模板) |
(C++11) |
檢查型別是否為非聯合類型別 (類模板) |
(C++11) |
檢查型別是否為函式型別 (類模板) |
(C++11) |
檢查型別是否為指標型別 (類模板) |
(C++11) |
檢查型別是否為*左值引用* (類模板) |
(C++11) |
檢查型別是否為右值引用 (類模板) |
(C++11) |
檢查型別是否為非靜態成員物件指標 (類模板) |
(C++11) |
檢查型別是否為非靜態成員函式指標 (類模板) |
複合型別類別 (Composite type categories) | |
定義於標頭檔案
<type_traits> | |
(C++11) |
檢查型別是否為基本型別 (類模板) |
(C++11) |
檢查型別是否為算術型別 (類模板) |
(C++11) |
檢查型別是否為標量型別 (類模板) |
(C++11) |
檢查型別是否為物件型別 (類模板) |
(C++11) |
檢查型別是否為複合型別 (類模板) |
(C++11) |
檢查型別是否為*左值引用*或*右值引用* (類模板) |
(C++11) |
檢查型別是否為指向非靜態成員函式或物件的指標 (類模板) |
型別屬性 | |
定義於標頭檔案
<type_traits> | |
(C++11) |
檢查型別是否為 const 限定 (類模板) |
(C++11) |
檢查型別是否為 volatile 限定 (類模板) |
(C++11)(C++26 中已棄用) |
檢查型別是否為平凡型別 (類模板) |
(C++11) |
檢查型別是否為可平凡複製型別 (類模板) |
(C++11) |
檢查型別是否為標準佈局型別 (類模板) |
(C++11)(C++20 中已棄用) |
檢查型別是否為純舊資料 (POD) 型別 (類模板) |
(C++11)(C++17 中已棄用)(C++20 中已移除) |
檢查型別是否為字面型別 (類模板) |
檢查型別物件表示中的每個位是否都影響其值 (類模板) | |
(C++11) |
檢查型別是否為類(而非聯合)型別且沒有非靜態資料成員 (類模板) |
(C++11) |
檢查型別是否為多型類型別 (類模板) |
(C++11) |
檢查型別是否為抽象類型別 (類模板) |
(C++14) |
檢查型別是否為 final 類型別 (類模板) |
(C++17) |
檢查型別是否為聚合型別 (類模板) |
(C++23) |
檢查型別是否是隱式生命週期型別 (類模板) |
(C++11) |
檢查型別是否為有符號算術型別 (類模板) |
(C++11) |
檢查型別是否為無符號算術型別 (類模板) |
(C++20) |
檢查型別是否為已知邊界的陣列型別 (類模板) |
(C++20) |
檢查型別是否為未知邊界的陣列型別 (類模板) |
(C++23) |
檢查一個型別是否是有作用域的列舉型別 (類模板) |
支援的操作 | |
定義於標頭檔案
<type_traits> | |
(C++11)(C++11)(C++11) |
檢查型別是否具有針對特定引數的建構函式 (類模板) |
檢查型別是否具有預設建構函式 (類模板) | |
(C++11)(C++11)(C++11) |
檢查型別是否具有複製建構函式 (類模板) |
(C++11)(C++11)(C++11) |
檢查型別是否可以從右值引用構造 (類模板) |
(C++11)(C++11)(C++11) |
檢查型別是否具有針對特定引數的賦值運算子 (類模板) |
(C++11)(C++11)(C++11) |
檢查型別是否具有複製賦值運算子 (類模板) |
(C++11)(C++11)(C++11) |
檢查型別是否有移動賦值運算子 (類模板) |
(C++11)(C++11)(C++11) |
檢查型別是否具有非刪除的解構函式 (類模板) |
(C++11) |
檢查型別是否具有虛解構函式 (類模板) |
(C++17)(C++17)(C++17)(C++17) |
檢查一種型別的物件是否可以與相同或不同型別的物件進行交換 (類模板) |
檢查引用在直接初始化中是否繫結到臨時物件 (類模板) | |
檢查引用在複製初始化中是否繫結到臨時物件 (類模板) |
[編輯] 屬性查詢
屬性查詢特性可用於在編譯時查詢型別的整數屬性。
所有這些型別特性都滿足 UnaryTypeTrait,每個型別特性的基本特性是 std::integral_constant<std::size_t, Value>,其中 Value
是相應屬性的查詢結果。
定義於標頭檔案
<type_traits> | |
(C++11) |
獲取型別的對齊要求 (類模板) |
(C++11) |
獲取陣列型別的維數 (類模板) |
(C++11) |
獲取陣列型別在指定維度上的大小 (類模板) |
[編輯] 型別關係
型別關係特性可用於在編譯時查詢型別之間的關係。
所有這些型別特性都滿足 BinaryTypeTrait,每個型別特性的基本特性要麼是 std::true_type,要麼是 std::false_type,具體取決於是否滿足相應的條件。
定義於標頭檔案
<type_traits> | |
(C++11) |
檢查兩個型別是否相同 (類模板) |
(C++11) |
檢查一個型別是否為另一個型別的基類 (類模板) |
(C++26) |
檢查一個型別是否為另一個型別的虛基類 (類模板) |
(C++11)(C++20) |
檢查一個型別是否可以轉換為另一個型別 (類模板) |
(C++20) |
檢查兩個型別是否佈局相容 (類模板) |
檢查一個型別是否為另一個型別的指標可互轉(初始)基類 (類模板) | |
檢查一個型別是否可以使用給定引數型別進行呼叫(如同透過 std::invoke) (類模板) |
[編輯] 型別轉換
型別轉換特性根據一些預定義規則將一種型別轉換為另一種型別。
所有這些型別特性都滿足 TransformationTrait。
const-volatile 限定符 | |
定義於標頭檔案
<type_traits> | |
(C++11)(C++11)(C++11) |
從給定型別中移除 const 和/或 volatile 限定符 (類模板) |
(C++11)(C++11)(C++11) |
向給定型別新增 const 和/或 volatile 限定符 (類模板) |
引用 | |
定義於標頭檔案
<type_traits> | |
(C++11) |
從給定型別中移除引用 (類模板) |
(C++11)(C++11) |
向給定型別新增左值或右值引用 (類模板) |
符號修飾符 | |
定義於標頭檔案
<type_traits> | |
(C++11) |
獲取給定整型對應的有符號型別 (類模板) |
(C++11) |
獲取給定整型對應的有符號型別 (類模板) |
陣列 | |
定義於標頭檔案
<type_traits> | |
(C++11) |
從給定陣列型別中移除一個維度 (類模板) |
(C++11) |
從給定陣列型別中移除所有維度 (類模板) |
指標 | |
定義於標頭檔案
<type_traits> | |
(C++11) |
從給定型別中移除指標 (類模板) |
(C++11) |
向給定型別新增指標 (類模板) |
其他轉換 | |
定義於標頭檔案
<type_traits> | |
(自 C++11)(C++23 中已棄用) |
定義適合用作給定大小型別的未初始化儲存的型別 (類模板) |
(自 C++11)(C++23 中已棄用) |
定義適合用作所有給定型別的未初始化儲存的型別 (類模板) |
(C++11) |
當函式引數按值傳遞時應用型別轉換 (類模板) |
(C++20) |
結合了 std::remove_cv 和 std::remove_reference (類模板) |
(C++11) |
有條件地從過載解析中移除函式過載或模板特化 (類模板) |
(C++11) |
根據編譯時布林值選擇一種型別或另一種型別 (類模板) |
(C++11) |
確定一組型別的公共型別 (類模板) |
確定一組型別的公共引用型別 (類模板) | |
(C++11) |
獲取給定列舉型別的底層整數型別 (類模板) |
(C++11)(C++20 中已移除)(C++17) |
推導呼叫可呼叫物件與一組引數的結果型別 (類模板) |
(C++17) |
void 可變引數別名模板 (別名模板) |
(C++20) |
返回不變的型別引數 (類模板) |
[編輯] 邏輯運算 (C++17 起)
邏輯運算子特性將邏輯運算子應用於其他型別特性。
定義於標頭檔案
<type_traits> | |
(C++17) |
可變引數邏輯 AND 元函式 (類模板) |
(C++17) |
可變引數邏輯 OR 元函式 (類模板) |
(C++17) |
邏輯 NOT 元函式 (類模板) |
[編輯] 成員關係 (C++20 起)
定義於標頭檔案
<type_traits> | |
檢查一個型別的物件是否與該型別的指定子物件指標可互轉 (函式模板) | |
(C++20) |
檢查兩個指定的成員是否在兩個指定型別的共同初始子序列中相互對應 (函式模板) |
[編輯] 編譯時有理算術
標頭檔案 <ratio> 提供了 用於操作和儲存編譯時比率的型別和函式。
[編輯] 編譯時整數序列 (C++14 起)
在標頭檔案
<utility> 中定義 | |
(C++14) |
實現編譯時整數序列 (類模板) |