跳到主要内容

C++ 命名要求:CharTraits

CharTraits 是一个特性类,它为给定的字符类型抽象了基本的字符和字符串操作。大多数标准库字符串和输入/输出类除了相应的字符模板类型参数外,还需要一个 CharTraits 模板类型参数。

要求

下面列出的 CharTraits 操作不得抛出异常。

给定

  • CharT,一个字符类型
  • X,一个用于类型 CharTCharTraits 类型
  • 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_typeCharT用于指代字符类型编译时
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::istreamstd::ostreamstd::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) 中的每个 iX::eq(p[i], q[i])true,则返回 0
* 否则,如果为负值
 * 对于 [0, n) 中的某个 jX::lt(p[j], q[j])true
 * 对于 [0, j) 中的每个 iX::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* 返回:如果对于某个 cX::eq_int_type(e, X::to_int_type(c))true,则返回 c
* 否则返回某个未指定值
常量
X::to_int_type(c)X::int_type返回:某个值 e,受 X::to_char_typeX::eq_int_type 定义的约束常量
X::eq_int_type(e, f)bool* 对于所有 cdX::eq(c, d) 等于 X::eq_int_type(X::to_int_type(c), X::to_int_type(d))
* 返回
 * 如果对于某个 cde == X::to_int_type(c)
  f == X::to_int_type(d),则生成 X::eq(c, d)
 * 否则,如果 ef 都是 X::eof() 的副本,则生成 true
 * 否则,如果 ef 中的一个副本是 X::eof() 的副本
  而另一个不是,则生成 false
 * 否则该值未指定
常量
X::eof()X::int_type返回:一个值 e,使得对于所有值 cX::eq_int_type(e, X::to_int_type(c))false常量

标准库

CharTraits 被以下标准库类模板作为模板类型参数要求

字符串

pubbasic_string存储和操作字符序列
pubbasic_string_view(C++17)只读字符串视图

pubbasic_ios管理任意流缓冲区
pubbasic_istream包装给定抽象设备(std::basic_streambuf)并提供高级输入接口
pubbasic_ifstream实现高级文件流输入操作
pubbasic_istringstream实现高级字符串流输入操作
pubbasic_ispanstream(C++23)实现固定字符缓冲区输入操作
pubbasic_ostream包装给定抽象设备(std::basic_streambuf)并提供高级输出接口
pubbasic_ofstream实现高级文件流输出操作
pubbasic_ostringstream实现高级字符串流输出操作
pubbasic_osyncstream(C++20)同步输出流包装器
pubbasic_ospanstream(C++23)实现固定字符缓冲区输出操作
pubbasic_iostream包装给定抽象设备(std::basic_streambuf)并提供高级输入/输出接口
pubbasic_fstream实现高级文件流输入/输出操作
pubbasic_stringstream实现高级字符串流输入/输出操作
pubbasic_spanstream(C++23)实现固定字符缓冲区输入/输出操作

流迭代器

pubistream_iteratorstd::basic_istream 读取的输入迭代器
pubostream_iterator写入 std::basic_ostream 的输出迭代器

流缓冲区

pubbasic_streambuf抽象原始设备
pubbasic_filebuf实现原始文件设备
pubbasic_stringbuf实现原始字符串设备
pubbasic_syncbuf(C++20)同步输出设备包装器
pubbasic_spanbuf(C++23)实现原始固定字符缓冲区设备

流缓冲区迭代器

pubistreambuf_iteratorstd::basic_streambuf 读取的输入迭代器
pubostreambuf_iterator写入 std::basic_streambuf 的输出迭代器

以下标准库类满足 CharTraits

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 335C++98assign 的二元重载要求不允许赋值给右值其第一个参数只能是左值
LWG 352C++98X::state_type 仅被要求为 可复制构造它还被要求为 可复制赋值可默认构造
LWG 3085C++98X::copy 仅要求 p 不在 [s, s + n) 中,这太弱了 [1]要求 [p, p + n)[s, s + n) 不重叠

[1] [p, p + n)[s, s + n) 可以重叠,在这种情况下使用 std::memcpy 实现 X::copy 会导致未定义行为。

C++ 命名要求:CharTraits

CharTraits 是一个特性类,它为给定的字符类型抽象了基本的字符和字符串操作。大多数标准库字符串和输入/输出类除了相应的字符模板类型参数外,还需要一个 CharTraits 模板类型参数。

要求

下面列出的 CharTraits 操作不得抛出异常。

给定

  • CharT,一个字符类型
  • X,一个用于类型 CharTCharTraits 类型
  • 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_typeCharT用于指代字符类型编译时
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::istreamstd::ostreamstd::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) 中的每个 iX::eq(p[i], q[i])true,则返回 0
* 否则,如果为负值
 * 对于 [0, n) 中的某个 jX::lt(p[j], q[j])true
 * 对于 [0, j) 中的每个 iX::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* 返回:如果对于某个 cX::eq_int_type(e, X::to_int_type(c))true,则返回 c
* 否则返回某个未指定值
常量
X::to_int_type(c)X::int_type返回:某个值 e,受 X::to_char_typeX::eq_int_type 定义的约束常量
X::eq_int_type(e, f)bool* 对于所有 cdX::eq(c, d) 等于 X::eq_int_type(X::to_int_type(c), X::to_int_type(d))
* 返回
 * 如果对于某个 cde == X::to_int_type(c)
  f == X::to_int_type(d),则生成 X::eq(c, d)
 * 否则,如果 ef 都是 X::eof() 的副本,则生成 true
 * 否则,如果 ef 中的一个副本是 X::eof() 的副本
  而另一个不是,则生成 false
 * 否则该值未指定
常量
X::eof()X::int_type返回:一个值 e,使得对于所有值 cX::eq_int_type(e, X::to_int_type(c))false常量

标准库

CharTraits 被以下标准库类模板作为模板类型参数要求

字符串

pubbasic_string存储和操作字符序列
pubbasic_string_view(C++17)只读字符串视图

pubbasic_ios管理任意流缓冲区
pubbasic_istream包装给定抽象设备(std::basic_streambuf)并提供高级输入接口
pubbasic_ifstream实现高级文件流输入操作
pubbasic_istringstream实现高级字符串流输入操作
pubbasic_ispanstream(C++23)实现固定字符缓冲区输入操作
pubbasic_ostream包装给定抽象设备(std::basic_streambuf)并提供高级输出接口
pubbasic_ofstream实现高级文件流输出操作
pubbasic_ostringstream实现高级字符串流输出操作
pubbasic_osyncstream(C++20)同步输出流包装器
pubbasic_ospanstream(C++23)实现固定字符缓冲区输出操作
pubbasic_iostream包装给定抽象设备(std::basic_streambuf)并提供高级输入/输出接口
pubbasic_fstream实现高级文件流输入/输出操作
pubbasic_stringstream实现高级字符串流输入/输出操作
pubbasic_spanstream(C++23)实现固定字符缓冲区输入/输出操作

流迭代器

pubistream_iteratorstd::basic_istream 读取的输入迭代器
pubostream_iterator写入 std::basic_ostream 的输出迭代器

流缓冲区

pubbasic_streambuf抽象原始设备
pubbasic_filebuf实现原始文件设备
pubbasic_stringbuf实现原始字符串设备
pubbasic_syncbuf(C++20)同步输出设备包装器
pubbasic_spanbuf(C++23)实现原始固定字符缓冲区设备

流缓冲区迭代器

pubistreambuf_iteratorstd::basic_streambuf 读取的输入迭代器
pubostreambuf_iterator写入 std::basic_streambuf 的输出迭代器

以下标准库类满足 CharTraits

缺陷报告

以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。

DR应用于发布时的行为正确行为
LWG 335C++98assign 的二元重载要求不允许赋值给右值其第一个参数只能是左值
LWG 352C++98X::state_type 仅被要求为 可复制构造它还被要求为 可复制赋值可默认构造
LWG 3085C++98X::copy 仅要求 p 不在 [s, s + n) 中,这太弱了 [1]要求 [p, p + n)[s, s + n) 不重叠

[1] [p, p + n)[s, s + n) 可以重叠,在这种情况下使用 std::memcpy 实现 X::copy 会导致未定义行为。