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
會導致未定義行為。