命名空间
变体
操作

C++ 命名要求: CharTraits

来自 cppreference.com
 
 
C++ 命名要求
 

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_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::istreamstd::ostreamstd::streambuf 成员的实参是未定义的行为
  • 如果此类型不是 std::streampos,当 X 用作输入/输出类中的特质模板参数时,会调用实现定义的行为
X::state_type  可销毁可复制赋值可复制构造可默认构造

[编辑] 表达式

表达式 返回类型 语义  复杂度 
X::eq(c, d) bool 返回:是否将 c 视为与 d 相等 常数
X::lt(c, d) bool 返回:是否将 c 视为小于 d 常数
X::compare(p, q, n) int 返回
  • 0 如果对于 [0n) 中的每个 iX::eq(p[i], q[i])true
  • 否则,如果为负值,则
    • 对于 [0n) 中的某个 jX::lt(p[j], q[j])true 并且
    • 对于 [0j) 中的每个 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* 返回
  • [pp + n) 中满足 X::eq(*q, c)true 的最小 q
  • 否则为 0
线性
X::move(s, p, n) X::char_type*
  • 对于每个 i[0n) 中,执行 X::assign(s[i], p[i])
  • 即使范围 [pp + n)[ss + n) 重叠,也会正确复制
  • 返回:s
线性
X::copy(s, p, n) X::char_type*
  • 要求:[pp + n)[ss + n) 不重叠
  • 返回:s
  • 对于每个 i[0n) 中,执行 X::assign(s[i], p[i])
线性
X::assign(r, d) (未用) 赋值 r = d 常数
X::assign(s, n, c) X::char_type*
  • 对于每个 i[0n) 中,执行 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
  • 否则为某个未指定的 value
常数
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,使得 X::eq_int_type(e, X::to_int_type(c)) 对所有值 c 都是 false 常数

[edit] 标准库

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

字符串
存储和操作字符序列
(类模板) [edit]
只读字符串视图
(类模板) [edit]
管理任意流缓冲区
(类模板) [edit]
封装给定的抽象设备 (std::basic_streambuf)
并提供高级输入接口
(类模板) [edit]
实现高级文件流输入操作
(类模板) [edit]
实现高级字符串流输入操作
(类模板) [edit]
实现固定字符缓冲区输入操作
(类模板) [edit]
封装给定的抽象设备 (std::basic_streambuf)
并提供高级输出接口
(类模板) [edit]
实现高级文件流输出操作
(类模板) [edit]
实现高级字符串流输出操作
(类模板) [edit]
同步输出流包装器
(类模板) [edit]
实现固定字符缓冲区输出操作
(类模板) [edit]
封装给定的抽象设备 (std::basic_streambuf)
并提供高级输入/输出接口
(类模板) [edit]
实现高级文件流输入/输出操作
(类模板) [edit]
实现高级字符串流输入/输出操作
(类模板) [edit]
实现固定字符缓冲区输入/输出操作
(类模板) [edit]
流迭代器
std::basic_istream 读取的输入迭代器
(类模板) [编辑]
写入 std::basic_ostream 的输出迭代器
(类模板) [编辑]
流缓冲区
抽象原始设备
(类模板) [编辑]
实现原始文件设备
(类模板) [编辑]
实现原始字符串设备
(类模板) [编辑]
同步输出设备包装器
(类模板) [编辑]
实现原始固定字符缓冲区设备
(类模板) [编辑]
流缓冲区迭代器
std::basic_streambuf 读取的输入迭代器
(类模板) [编辑]
写入 std::basic_streambuf 的输出迭代器
(类模板) [编辑]


CharTraits 由以下 std::char_traits 的标准库显式特化满足

template<> class char_traits<char>;

template<> class char_traits<wchar_t>;
template<> class char_traits<char8_t>;
template<> class char_traits<char16_t>;

template<> class char_traits<char32_t>;


(自 C++20 起)
(自 C++11 起)
(自 C++11 起)

[编辑] 缺陷报告

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

DR 应用于 已发布的行为 正确行为
LWG 335 C++98
assign 的二元重载的规定没有阻止赋值给右值
其第一个参数
只能是左值
LWG 352 C++98 X::state_type
要求为 CopyConstructible
它也要求为
CopyAssignableDefaultConstructible
LWG 3085 C++98 X::copy(s, p, n) 仅要求 p 不在
[ss + n) 中,这太弱了[1]
要求 [pp + n)
[ss + n) 不重叠
  1. [pp + n)[ss + n) 可能重叠,使用 std::memcpy 来实现 X::copy 在这种情况下会导致未定义行为。