C++ 命名要求: CharTraits
來自 cppreference.com
CharTraits 是一個特性類,它為給定的字元型別抽象了基本的字元和字串操作。大多數標準庫字串和輸入/輸出類都需要一個 CharTraits 模板型別引數以及一個對應的字元模板型別引數。
目錄 |
[編輯] 要求
以下列出的對 CharTraits 的操作均不得丟擲異常。
給定
-
CharT,一個字元型別 -
X,一個針對型別CharT的 CharTraits 型別 - c, d, 型別
CharT的值 - p, q, 型別 const CharT* 的值
- s, 型別
CharT*的值 - n, i, j, 型別 std::size_t 的值
- e, f, 型別
X::int_type的值 - pos, 型別
X::pos_type的值 - state, 型別
X::state_type的值 - r, 型別
CharT的左值
[編輯] 型別
| 型別 | 語義 |
|---|---|
X::char_type |
CharT
|
X::int_type |
一種型別,可以容納所有 X::char_type 的有效值,加上 X::eof() |
X::off_type |
如果 X 在輸入/輸出類中用作特性模板引數時不是 std::streamoff,則呼叫實現定義的行為。 |
X::pos_type |
|
X::state_type |
可析構 (Destructible), 可複製賦值 (CopyAssignable), 可複製構造 (CopyConstructible), 可預設構造 (DefaultConstructible) |
[編輯] 表示式
| 表示式 | 返回型別 | 語義 | 複雜度 |
|---|---|---|---|
| X::eq(c, d) | bool | 返回:c 是否應被視為等於 d | 常量 |
| X::lt(c, d) | bool | 返回:c 是否應被視為小於 d | 常量 |
| X::compare(p, q, n) | int | 返回
|
線性 |
| X::length(p) | std::size_t | 返回:最小的 i,使得 X::eq(p[i], CharT()) 為 true | 線性 |
| X::find(p, n, c) | const X::char_type* | 返回
|
線性 |
| X::move(s, p, n) | X::char_type* |
|
線性 |
| X::copy(s, p, n) | X::char_type* |
|
線性 |
| X::assign(r, d) | (未使用) | 賦值 r = d | 常量 |
| X::assign(s, n, c) | X::char_type* |
|
線性 |
| X::not_eof(e) | X::int_type |
返回
|
常量 |
| X::to_char_type(e) | X::char_type |
返回
|
常量 |
| X::to_int_type(c) | X::int_type |
返回:某個值 e,受 X::to_char_type 和 X::eq_int_type 的定義約束 |
常量 |
| X::eq_int_type(e, f) | bool |
|
常量 |
| X::eof() | X::int_type |
返回:一個值 e,使得對於所有值 c,X::eq_int_type(e, X::to_int_type(c)) 為 false | 常量 |
[編輯] 標準庫
以下標準庫類模板需要 CharTraits 作為模板型別引數
字串 | |
| 儲存和操作字元序列 (類模板) | |
| (C++17) |
只讀字串檢視 (類模板) |
流 | |
| 管理任意流緩衝區 (類模板) | |
| 包裝給定的抽象裝置(std::basic_streambuf) 並提供高階輸入介面 (類模板) | |
| 實現高階檔案流輸入操作 (類模板) | |
| 實現高階字串流輸入操作 (類模板) | |
| (C++23) |
實現固定字元緩衝區輸入操作 (類模板) |
| 包裝給定的抽象裝置(std::basic_streambuf) 並提供高階輸出介面 (類模板) | |
| 實現高階檔案流輸出操作 (類模板) | |
| 實現高階字串流輸出操作 (類模板) | |
| (C++20) |
同步輸出流包裝器 (類模板) |
| (C++23) |
實現固定字元緩衝區輸出操作 (類模板) |
| 包裝給定的抽象裝置(std::basic_streambuf) 並提供高階輸入/輸出介面 (類模板) | |
| 實現高階檔案流輸入/輸出操作 (類模板) | |
| 實現高階字串流輸入/輸出操作 (類模板) | |
| (C++23) |
實現固定字元緩衝區輸入/輸出操作 (類模板) |
流迭代器 | |
| 從std::basic_istream讀取的輸入迭代器 (類模板) | |
| 寫入std::basic_ostream的輸出迭代器 (類模板) | |
流緩衝區 | |
| 抽象原始裝置 (類模板) | |
| 實現原始檔案裝置 (類模板) | |
| 實現原始字串裝置 (類模板) | |
| (C++20) |
同步輸出裝置包裝器 (類模板) |
| (C++23) |
實現原始固定字元緩衝區裝置 (類模板) |
流緩衝區迭代器 | |
| 從std::basic_streambuf讀取的輸入迭代器 (類模板) | |
| 寫入std::basic_streambuf的輸出迭代器 (類模板) | |
CharTraits 由 std::char_traits 的以下標準庫顯式特化滿足
| template<> class char_traits<char>; template<> class char_traits<wchar_t>; |
(C++20 起) (C++11 起) (C++11 起) |
|
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
| 缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 335 | C++98 | 關於二進位制過載 assign 的要求未阻止對右值的賦值 |
其第一個引數 只能是左值 |
| LWG 352 | C++98 | X::state_type 僅被要求為 可複製構造 (CopyConstructible) |
它還被要求為 可複製賦值 (CopyAssignable) 和 可預設構造 (DefaultConstructible) |
| LWG 3085 | C++98 | X::copy(s, p, n) 僅要求 p 不在[s, s + n) 中,這太弱了[1] |
要求 [p, p + n) 和[s, s + n) 不重疊 |
- ↑
[p,p + n)和[s,s + n)可以重疊,在這種情況下,使用 std::memcpy 實現X::copy會導致未定義行為。