Именованные требования C++: CharTraits
CharTraits — это класс traits, абстрагирующий базовые операции с символами и строками для заданного типа символов. Для большинства строковых классов и классов ввода/вывода стандартной библиотеки требуется параметр шаблона типа CharTraits наряду с соответствующим параметром шаблона типа символа.
Требования
Ни одна из перечисленных ниже операций CharTraits не должна выбрасывать исключения.
Пусть заданы
-
CharT, тип символа -
X, тип CharTraits для типаCharT -
c,d, значения типаCharT -
p,q, значения типа constCharT* -
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 используется как параметр шаблона traits в классах ввода/вывода. |
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) | constX::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 не запрещали присваивание rvalue | её первый аргумент может быть только 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/cpp/named_req/CharTraits