C++ named requirements: CharTraits
CharTraits is a traits class that abstracts basic character and string operations for a given character type. Most standard library string and input/output classes require a CharTraits template type parameter alongside a corresponding character template type parameter.
Requirements
No operation listed below on CharTraits may throw an exception.
Given
-
CharT
, a character type -
X
, a CharTraits type for typeCharT
-
c
,
d
, values of type
CharT
- p , q , values of type const CharT *
-
s
, a value of type
CharT*
- n , i , j , values of type std::size_t
-
e
,
f
, values of type
X::int_type
-
pos
, a value of type
X::pos_type
-
state
, a value of type
X::state_type
-
r
, an lvalue of type
CharT
Types
Type | Semantics |
---|---|
X::char_type
|
CharT
|
X::int_type
|
A type that can hold all valid values of
X::char_type
plus
X
::
eof
(
)
|
X::off_type
|
Invokes implementation-defined behavior if not
std::streamoff
when
X
is used as the traits template parameter in input/output classes.
|
X::pos_type
|
|
X::state_type
|
Destructible , CopyAssignable , CopyConstructible , DefaultConstructible |
Expressions
Expression | Return type | Semantics | Complexity |
---|---|---|---|
X :: eq ( c, d ) | bool | Returns: whether c is to be treated as equal to d | Constant |
X :: lt ( c, d ) | bool | Returns: whether c is to be treated as less than d | Constant |
X :: compare ( p, q, n ) | int |
Returns:
|
Linear |
X :: length ( p ) | std::size_t | Returns: the smallest i such that X :: eq ( p [ i ] , CharT ( ) ) is true | Linear |
X :: find ( p, n, c ) | const X :: char_type * |
Returns:
|
Linear |
X :: move ( s, p, n ) |
X::char_type*
|
|
Linear |
X :: copy ( s, p, n ) |
X::char_type*
|
|
Linear |
X :: assign ( r, d ) | (Not used) | Assigns r = d | Constant |
X :: assign ( s, n, c ) |
X::char_type*
|
|
Linear |
X :: not_eof ( e ) |
X::int_type
|
Returns:
|
Constant |
X :: to_char_type ( e ) |
X::char_type
|
Returns:
|
Constant |
X :: to_int_type ( c ) |
X::int_type
|
Returns: some value
e
, constrained by the definitions of
X::to_char_type
and
X::eq_int_type
|
Constant |
X :: eq_int_type ( e, f ) | bool |
|
Constant |
X :: eof ( ) |
X::int_type
|
Returns: a value e such that X :: eq_int_type ( e, X :: to_int_type ( c ) ) is false for all values c | Constant |
Standard library
CharTraits is required by the following standard library class templates as a template type parameter:
Strings |
|
stores and manipulates sequences of characters
(class template) |
|
(C++17)
|
read-only string view
(class template) |
Streams |
|
manages an arbitrary stream buffer
(class template) |
|
wraps a given abstract device (
std::basic_streambuf
)
and provides high-level input interface (class template) |
|
implements high-level file stream input operations
(class template) |
|
implements high-level string stream input operations
(class template) |
|
(C++23)
|
implements fixed character buffer input operations
(class template) |
wraps a given abstract device (
std::basic_streambuf
)
and provides high-level output interface (class template) |
|
implements high-level file stream output operations
(class template) |
|
implements high-level string stream output operations
(class template) |
|
(C++20)
|
synchronized output stream wrapper
(class template) |
(C++23)
|
implements fixed character buffer output operations
(class template) |
wraps a given abstract device (
std::basic_streambuf
)
and provides high-level input/output interface (class template) |
|
implements high-level file stream input/output operations
(class template) |
|
implements high-level string stream input/output operations
(class template) |
|
(C++23)
|
implements fixed character buffer input/output operations
(class template) |
Stream iterators |
|
input iterator that reads from
std::basic_istream
(class template) |
|
output iterator that writes to
std::basic_ostream
(class template) |
|
Stream buffers |
|
abstracts a raw device
(class template) |
|
implements raw file device
(class template) |
|
implements raw string device
(class template) |
|
(C++20)
|
synchronized output device wrapper
(class template) |
(C++23)
|
implements raw fixed character buffer device
(class template) |
Stream buffer iterators |
|
input iterator that reads from
std::basic_streambuf
(class template) |
|
output iterator that writes to
std::basic_streambuf
(class template) |
CharTraits
is satisfied by the following standard library explicit specializations of
std::char_traits
:
template
<>
class
char_traits
<
char
>
;
template
<>
class
char_traits
<
wchar_t
>
;
|
(since C++20) (since C++11) (since C++11) |
|
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 335 | C++98 |
the requirements on the binary overload of
assign
did not prevent assignments to rvalues
|
its first argument
can only be an lvalue |
LWG 352 | C++98 |
X::state_type
was only
required to be CopyConstructible |
it is also required to be
CopyAssignable and DefaultConstructible |
LWG 3085 | C++98 |
X
::
copy
(
s, p, n
)
only required
p
not
in
[
s
,
s
+
n
)
, which is too weak
[1]
|
requires
[
p
,
p
+
n
)
and
[
s
,
s
+
n
)
not to overlap
|
-
↑
[
p,
p + n)
and[
s,
s + n)
can overlap, using std::memcpy to implementX::copy
results in undefined behavior in this case.