Namespaces
Variants

C++ named requirements: CharTraits

From cppreference.net
C++ named requirements

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 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 若对于 [ 0 , n ) 范围内的每个 i X :: eq ( p [ i ] , q [ i ] ) 均为 true
  • 否则,返回负值若满足:
    • 存在 j [ 0 , n ) 范围内,使得 X :: lt ( p [ j ] , q [ j ] ) true ,且
    • 对于 [ 0 , j ) 范围内的每个 i X :: eq ( p [ i ] , q [ i ] ) 均为 true
  • 否则返回正值
线性复杂度
X :: length ( p ) std::size_t 返回:满足 X :: eq ( p [ i ] , CharT ( ) ) true 的最小 i 线性
X :: find ( p, n, c ) const X :: char_type * 返回值:
  • 在范围 [ p , p + n ) 内满足 X :: eq ( * q, c ) true 的最小 q
  • 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 返回值:
  • e X :: eq_int_type ( e, X :: eof ( ) ) false
  • 否则返回一个值 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 ) ,则返回 X :: eq ( c, 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 作为模板类型参数被以下标准库类模板所要求:

字符串
存储和操作字符序列
(类模板)
只读字符串视图
(类模板)
管理任意流缓冲区
(类模板)
封装给定的抽象设备( std::basic_streambuf
并提供高层输入接口
(类模板)
实现高级文件流输入操作
(类模板)
实现高级字符串流输入操作
(类模板)
实现固定字符缓冲区输入操作
(类模板)
封装给定的抽象设备( std::basic_streambuf
并提供高层输出接口
(类模板)
实现高级文件流输出操作
(类模板)
实现高级字符串流输出操作
(类模板)
同步输出流包装器
(类模板)
实现固定字符缓冲区的输出操作
(类模板)
封装给定的抽象设备( std::basic_streambuf
并提供高层级输入/输出接口
(类模板)
实现高层级文件流输入/输出操作
(类模板)
实现高级字符串流输入/输出操作
(类模板)
实现固定字符缓冲区的输入/输出操作
(类模板)
流迭代器
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++ 标准。

问题报告 适用标准 已发布行为 正确行为
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 不在
[ s , s + n ) 范围内,约束过弱 [1]
要求 [ p , p + n )
[ s , s + n ) 范围不得重叠
  1. [ p , p + n ) [ s , s + n ) 可能存在重叠区域,此时使用 std::memcpy 来实现 X::copy 将导致未定义行为。