命名空间
变体
操作

C++ 命名要求: CharTraits

来自 cppreference.cn
 
 
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 在输入/输出类中用作 traits 模板参数时,不是 std::streamoff,则调用实现定义的行为。
X::pos_type
  • 输入/输出类中返回此类型的函数使用 X::pos_type(X::off_type(-1)) 作为无效值来表示错误
  • 将此无效值用作任何接受此类型值的 std::istreamstd::ostreamstd::streambuf 成员的参数是未定义行为
  • 如果当 X 在输入/输出类中用作 traits 模板参数时,此类型不是 std::streampos,则调用实现定义的行为
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 返回
  • 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) 中最小的 q,使得 X::eq(*q, c)true
  • 0 否则
线性
X::move(s, p, n) X::char_type*
  • 对于 [0n) 中的每个 i,执行 X::assign(s[i], p[i])
  • 即使在范围 [pp + n)[ss + n) 重叠的情况下,也能正确复制
  • 返回:s
线性
X::copy(s, p, n) X::char_type*
  • 要求:[pp + n)[ss + n) 不重叠
  • 返回:s
  • 对于 [0n) 中的每个 i,执行 X::assign(s[i], p[i])
线性
X::assign(r, d) (未使用) 赋值 r = d 常数
X::assign(s, n, c) X::char_type*
  • 对于 [0n) 中的每个 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 作为模板类型参数

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


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

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>;


(since C++20)
(since C++11)
(since 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 会导致未定义行为。