C++ 命名要求: CharTraits
来自 cppreference.cn
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
会导致未定义行为。