C++ named requirements: CharTraits
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
|
返回值:某个值
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将导致未定义行为。