C++ именованные требования: CharTraits
CharTraits — это класс шаблонов, абстрагирующий базовые операции с символами и строками для данного типа символов. Большинство классов строк и ввода/вывода стандартной библиотеки требуют параметр шаблона CharTraits наряду с соответствующим параметром шаблона символов.
Требования
Ни одна из операций, перечисленных ниже для CharTraits, не может выбросить исключение.
Дано
-
CharT, тип символов -
X, тип CharTraits для типаCharT -
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, lvalue типаCharT
Типы
| Тип | Семантика |
|---|---|
X::char_type | CharT |
X::int_type | Тип, который может содержать все допустимые значения X::char_type плюс X::eof() |
X::off_type | Вызывает поведение, определённое реализацией, если не std::streamoff при использовании X в качестве параметра шаблона свойств в классах ввода/вывода. |
X::pos_type |
|
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 | Возвращает:
| Линейная |
X::length(p) | std::size_t | Возвращает: наименьшее i такое, что X::eq(p[i], CharT()) меньше true | Линейная |
X::find(p, n, c) | const X::char_type* | Возвращает:
| Линейная |
X::move(s, p, n) | X::char_type* |
| Линейная |
X::copy(s, p, n) | X::char_type* |
| Линейная |
X::assign(r, d) | (Не используется) | Присваивает r = d | Постоянная |
X::assign(s, n, c) | X::char_type* |
| Линейная |
X::not_eof(e) | X::int_type | Возвращает:
| Постоянная |
X::to_char_type(e) | X::char_type | Возвращает:
| Постоянная |
X::to_int_type(c) | X::int_type | Возвращает: некоторое значение e, ограниченное определениями X::to_char_type и X::eq_int_type | Постоянная |
X::eq_int_type(e, f) | bool |
| Постоянная |
X::eof() | X::int_type | Возвращает: значение e такое, что X::eq_int_type(e, X::to_int_type(c)) равно false для всех значений c | Постоянная |
Стандартная библиотека
CharTraits требуется следующими шаблонными классами стандартной библиотеки в качестве параметра шаблона:
Строки |
|
| хранит и обрабатывает последовательности символов (шаблон класса) |
|
|
(C++17) | только для чтения представление строки (шаблон класса) |
Потоки |
|
| управляет произвольным буфером потока (шаблон класса) |
|
оборачивает заданное абстрактное устройство (std::basic_streambuf)и предоставляет интерфейс ввода высокого уровня (шаблон класса) |
|
| реализует операции ввода потока файла высокого уровня (шаблон класса) |
|
| реализует операции ввода потока строки высокого уровня (шаблон класса) |
|
|
(C++23) | реализует операции ввода буфера фиксированного размера символов (шаблон класса) |
оборачивает заданное абстрактное устройство (std::basic_streambuf)и предоставляет интерфейс вывода высокого уровня (шаблон класса) |
|
| реализует операции вывода потока файла высокого уровня (шаблон класса) |
|
| реализует операции вывода потока строки высокого уровня (шаблон класса) |
|
|
(C++20) | оболочка синхронизированного потока вывода (шаблон класса) |
|
(C++23) | реализует операции вывода буфера фиксированного размера символов (шаблон класса) |
оборачивает заданное абстрактное устройство (std::basic_streambuf)и предоставляет интерфейс ввода/вывода высокого уровня (шаблон класса) |
|
| реализует операции ввода/вывода потока файла высокого уровня (шаблон класса) |
|
| реализует операции ввода/вывода потока строки высокого уровня (шаблон класса) |
|
|
(C++23) | реализует операции ввода/вывода буфера фиксированного размера символов (шаблон класса) |
Итераторы потоков |
|
итератор ввода, читающий из std::basic_istream (шаблон класса) |
|
итератор вывода, записывающий в std::basic_ostream (шаблон класса) |
|
Буферы потоков |
|
| абстрагирует базовое устройство (шаблон класса) |
|
| реализует базовое устройство файла (шаблон класса) |
|
| реализует базовое устройство строки (шаблон класса) |
|
|
(C++20) | оболочка синхронизированного устройства вывода (шаблон класса) |
|
(C++23) | реализует базовое устройство буфера фиксированного размера символов (шаблон класса) |
Итераторы буферов потоков |
|
итератор ввода, читающий из 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 не предотвращали присваивание rvalues | его первый аргумент может быть только lvalue |
| 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) не перекрываться |
-
[p,p + n)и[s,s + n)могут перекрываться, используяstd::memcpyдля реализацииX::copyприводит к неопределенному поведению в этом случае.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/CharTraits