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
的话行为未定义。