C++ 命名要求: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::pos_type(X::off_type(-1)) 作为无效值来表示错误* 将此无效值用作任何接受此类型值的 std::istream、std::ostream 或 std::streambuf 成员的参数是未定义行为 * 如果 X 在输入/输出类中用作特性模板参数时此类型不是 std::streampos,则调用实现定义行为 | 编译时 | |
X::state_type | 可析构, 可复制赋值, 可复制构造, 可默认构造 | 编译时 | |
X::eq(c, d) | bool | 返回:c 是否应被视为等于 d | 常量 |
X::lt(c, d) | bool | 返回:c 是否应被视为小于 d | 常量 |
X::compare(p, q, n) | int | 返回 * 如果对于 [ 0 , n ) 中的每个 i ,X::eq(p[i], q[i]) 为 true,则返回 0* 否则,如果为负值 * 对于 [ 0 , n ) 中的某个 j ,X::lt(p[j], q[j]) 为 true 且* 对于 [ 0 , j ) 中的每个 i ,X::eq(p[i], q[i]) 为 true* 否则为正值 | 线性 |
X::length(p) | std::size_t | 返回:最小的 i ,使得 X::eq(p[i], CharT()) 为 true | 线性 |
X::find(p, n, c) | const X::char_type* | 返回 * [ p , p + n ) 中最小的 q ,使得 X::eq(*q, c) 为 true* 否则为 0 | 线性 |
X::move(s, p, n) | X::char_type* | * 对于 [0 , n ) 中的每个 i ,执行 X::assign(s[i], p[i]) * 即使 [ p , p + n ) 和 [s , s + n ) 范围重叠,也能正确复制* 返回: s | 线性 |
X::copy(s, p, n) | X::char_type* | * 要求:[p , p + n ) 和 [s , s + n ) 不重叠* 返回: s * 对于 [ 0 , n ) 中的每个 i ,执行 X::assign(s[i], p[i]) | 线性 |
X::assign(r, d) | (未使用) | 赋值 r = d | 常量 |
X::assign(s, n, c) | X::char_type* | * 对于 [0 , n ) 中的每个 i ,执行 X::assign(s[i], c) 。* 返回: s | 线性 |
X::not_eof(e) | X::int_type | * 返回:如果 X::eq_int_type(e, X::eof()) 为 false,则返回 e * 否则返回一个值 f ,使得 X::eq_int_type(f, X::eof()) 为 false | 常量 |
X::to_char_type(e) | X::char_type | * 返回:如果对于某个 c ,X::eq_int_type(e, X::to_int_type(c)) 为 true,则返回 c * 否则返回某个未指定值 | 常量 |
X::to_int_type(c) | X::int_type | 返回:某个值 e ,受 X::to_char_type 和 X::eq_int_type 定义的约束 | 常量 |
X::eq_int_type(e, f) | bool | * 对于所有 c 和 d ,X::eq(c, d) 等于 X::eq_int_type(X::to_int_type(c), X::to_int_type(d)) * 返回 * 如果对于某个 c 和 d ,e == X::to_int_type(c) 且f == X::to_int_type(d),则生成 * 否则,如果 e 和 f 都是 X::eof() 的副本,则生成 true* 否则,如果 e 和 f 中的一个副本是 X::eof() 的副本而另一个不是,则生成 false * 否则该值未指定 | 常量 |
X::eof() | X::int_type | 返回:一个值 e ,使得对于所有值 c ,X::eq_int_type(e, X::to_int_type(c)) 为 false | 常量 |
标准库
CharTraits 被以下标准库类模板作为模板类型参数要求
字符串
pub | basic_string | 存储和操作字符序列 |
pub | basic_string_view(C++17) | 只读字符串视图 |
流
pub | basic_ios | 管理任意流缓冲区 |
pub | basic_istream | 包装给定抽象设备(std::basic_streambuf)并提供高级输入接口 |
pub | basic_ifstream | 实现高级文件流输入操作 |
pub | basic_istringstream | 实现高级字符串流输入操作 |
pub | basic_ispanstream(C++23) | 实现固定字符缓冲区输入操作 |
pub | basic_ostream | 包装给定抽象设备(std::basic_streambuf)并提供高级输出接口 |
pub | basic_ofstream | 实现高级文件流输出操作 |
pub | basic_ostringstream | 实现高级字符串流输出操作 |
pub | basic_osyncstream(C++20) | 同步输出流包装器 |
pub | basic_ospanstream(C++23) | 实现固定字符缓冲区输出操作 |
pub | basic_iostream | 包装给定抽象设备(std::basic_streambuf)并提供高级输入/输出接口 |
pub | basic_fstream | 实现高级文件流输入/输出操作 |
pub | basic_stringstream | 实现高级字符串流输入/输出操作 |
pub | basic_spanstream(C++23) | 实现固定字符缓冲区输入/输出操作 |
流迭代器
pub | istream_iterator | 从 std::basic_istream 读取的输入迭代器 |
pub | ostream_iterator | 写入 std::basic_ostream 的输出迭代器 |
流缓冲区
pub | basic_streambuf | 抽象原始设备 |
pub | basic_filebuf | 实现原始文件设备 |
pub | basic_stringbuf | 实现原始字符串设备 |
pub | basic_syncbuf(C++20) | 同步输出设备包装器 |
pub | basic_spanbuf(C++23) | 实现原始固定字符缓冲区设备 |
流缓冲区迭代器
pub | istreambuf_iterator | 从 std::basic_streambuf 读取的输入迭代器 |
pub | ostreambuf_iterator | 写入 std::basic_streambuf 的输出迭代器 |
以下标准库类满足 CharTraits
- template<> class char_traits<char>;
- template<> class char_traits<wchar_t>;
- template<> class char_traits<char8_t>; (自 C++20 起)
- template<> class char_traits<char16_t>; (自 C++11 起)
- template<> class char_traits<char32_t>; (自 C++11 起)
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 335 | C++98 | assign 的二元重载要求不允许赋值给右值 | 其第一个参数只能是左值 |
LWG 352 | C++98 | X::state_type 仅被要求为 可复制构造 | 它还被要求为 可复制赋值 和 可默认构造 |
LWG 3085 | C++98 | X::copy 仅要求 p 不在 [s, s + n) 中,这太弱了 [1] | 要求 [p, p + n) 和 [s, s + n) 不重叠 |
[1] [p, p + n)
和 [s, s + n)
可以重叠,在这种情况下使用 std::memcpy 实现 X::copy
会导致未定义行为。