命名空间
变体
操作

C++ 命名要求: CharTraits

来自 cppreference.cn
 
 
C++ 命名要求
基本
类型属性
全库范围




Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
(C++20)
随机数
并发
(C++11)
Ranges
多维视图
其他

 

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::istream, std::ostreamstd::streambuf 成员函数的参数(该成员函数接受此类型的值)是未定义行为
  • 如果 X 在输入/输出类中用作特性模板参数时此类型不是 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 返回
  • 如果对于 [0n) 中的每个 iX::eq(p[i], q[i])true,则返回 0
  • 否则,如果满足以下条件,返回负值:
    • 对于 [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的输出迭代器
(类模板) [编辑]


CharTraitsstd::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++ 标准。

缺陷报告 应用于 发布时的行为 正确的行为
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 不在
[ss + n) 中,这太弱了[1]
要求 [pp + n)
[ss + n) 不重叠
  1. [pp + n)[ss + n) 可以重叠,在这种情况下,使用 std::memcpy 实现 X::copy 会导致未定义行为。