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 |
可销毁、可复制赋值、可复制构造、可默认构造 |
[编辑] 表达式
表达式 | 返回类型 | 语义 | 复杂度 |
---|---|---|---|
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,使得 X::eq_int_type(e, X::to_int_type(c)) 对所有值 c 都是 false | 常数 |
[edit] 标准库
以下标准库类模板需要 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++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
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
在这种情况下会导致未定义行为。