Spec-Zone.ru › C++

Именованные требования 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::pos_type(X::off_type(-1)) как недопустимое значение, обозначающее ошибку
  • Использование этого недопустимого значения в качестве аргумента для любого члена std::istream, std::ostream или std::streambuf, принимающего значение этого типа, приводит к неопределённому поведению
  • Вызывает поведение, определяемое реализацией, если этот тип не является std::streampos, когда X используется как параметр шаблона traits в классах ввода/вывода
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, если для каждого i в [0, n), X::eq(p[i], q[i]) является true
  • Иначе отрицательное значение, если
    • Для некоторого j в [0, n), X::lt(p[j], q[j]) является true, и
    • для каждого i в [0, j), X::eq(p[i], q[i]) является true
  • Иначе положительное значение
Линейная
X::length(p) std::size_t Возвращает: наименьшее i, для которого X::eq(p[i], CharT()) является true Линейная
X::find(p, n, c) constX::char_type* Возвращает:
  • Наименьшее q в [p, p + n), для которого X::eq(*q, c) является true
  • 0 в противном случае
Линейная
X::move(s, p, n) X::char_type*
  • Для каждого i в [0, n) выполняет 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
  • Для каждого i в [0, n) выполняет X::assign(s[i], p[i])
Линейная
X::assign(r, d) (Не используется) Присваивает r = d Константная
X::assign(s, n, c) X::char_type*
  • Для каждого i в [0, n) выполняет 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))
  • Возвращает:
    • Выдаёт X::eq(c, d), если для некоторых c и d выполняются e == X::to_int_type(c) и f == X::to_int_type(d)
    • Иначе выдаёт true, если e и f являются копиями X::eof()
    • Иначе выдаёт false, если один из e и f является копией X::eof(), а другой — нет
    • Иначе значение не определено
Константная
X::eof() X::int_type Возвращает: значение e, такое что X::eq_int_type(e, X::to_int_type(c)) является false для всех значений c Константная

Стандартная библиотека

CharTraits требуется в качестве параметра шаблона типа для следующих шаблонов классов стандартной библиотеки:

Строки
basic_string
хранит и обрабатывает последовательности символов
(шаблон класса)
basic_string_view
(C++17)
представление строки только для чтения
(шаблон класса)
Потоки
basic_ios
управляет произвольным буфером потока
(шаблон класса)
basic_istream
оборачивает заданное абстрактное устройство (std::basic_streambuf)
и предоставляет высокоуровневый интерфейс ввода
(шаблон класса)
basic_ifstream
реализует высокоуровневые операции ввода из файлового потока
(шаблон класса)
basic_istringstream
реализует высокоуровневые операции ввода из строкового потока
(шаблон класса)
basic_ispanstream
(C++23)
реализует операции ввода из буфера фиксированной длины
(шаблон класса)
basic_ostream
оборачивает заданное абстрактное устройство (std::basic_streambuf)
и предоставляет высокоуровневый интерфейс вывода
(шаблон класса)
basic_ofstream
реализует высокоуровневые операции вывода в файловый поток
(шаблон класса)
basic_ostringstream
реализует высокоуровневые операции вывода в строковый поток
(шаблон класса)
basic_osyncstream
(C++20)
обёртка синхронизированного потока вывода
(шаблон класса)
basic_ospanstream
(C++23)
реализует операции вывода в буфер фиксированной длины
(шаблон класса)
basic_iostream
оборачивает заданное абстрактное устройство (std::basic_streambuf)
и предоставляет высокоуровневый интерфейс ввода/вывода
(шаблон класса)
basic_fstream
реализует высокоуровневые операции ввода/вывода файлового потока
(шаблон класса)
basic_stringstream
реализует высокоуровневые операции ввода/вывода строкового потока
(шаблон класса)
basic_spanstream
(C++23)
реализует операции ввода/вывода буфера фиксированной длины
(шаблон класса)
Итераторы потоков
istream_iterator
входной итератор, считывающий из std::basic_istream
(шаблон класса)
ostream_iterator
выходной итератор, записывающий в std::basic_ostream
(шаблон класса)
Буферы потоков
basic_streambuf
абстрагирует необработанное устройство
(шаблон класса)
basic_filebuf
реализует необработанное файловое устройство
(шаблон класса)
basic_stringbuf
реализует необработанное строковое устройство
(шаблон класса)
basic_syncbuf
(C++20)
обёртка синхронизированного устройства вывода
(шаблон класса)
basic_spanbuf
(C++23)
реализует необработанное устройство с буфером символов фиксированной длины
(шаблон класса)
Итераторы буферов потоков
istreambuf_iterator
входной итератор, считывающий из std::basic_streambuf
(шаблон класса)
ostreambuf_iterator
выходной итератор, записывающий в 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) не перекрывались
  1. [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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API