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 在输入/输出类中用作 traits 模板参数时,不是 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 的输出迭代器 (类模板) |
以下标准库显式特化 std::char_traits 满足 CharTraits
template<> class char_traits<char>; template<> class char_traits<wchar_t>; |
(since C++20) (since C++11) (since 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
会导致未定义行为。