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 | 返回:使得 X::eq(p[i], CharT()) 是 true 的最小 i | 线性 | 
| 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  | 
 返回:X::to_char_type 和 X::eq_int_type 的定义所制约的某个值 e  | 
常数 | 
| X::eq_int_type(e, f) | bool | 
  | 
常数 | 
| X::eof() |  X::int_type  | 
返回:使得 X::eq_int_type(e, X::to_int_type(c)) 对于所有值 c 都是 false 的值 e | 常数 | 
标准库
下列标准库类模板要求字符特性 (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 的输出迭代器  (类模板)  | |
下列标准库 std::char_traits 显式特化满足字符特性 (CharTraits) :
|   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的话行为未定义。