Пространства имён
Варианты
Действия

Библиотека концептов (начиная с C++20)

Материал из cppreference.com
< cpp
 
 
 

Библиотека концептов предоставляет определения основных концептов библиотеки, которые можно использовать для выполнения проверки аргументов шаблона во время компиляции и выполнения диспетчеризации функций на основе свойств типов. Эти концепты обеспечивают основу для логического мышления в программах.

Большинство концептов стандартной библиотеки налагают как синтаксические, так и семантические требования. Говорят, что стандартный концепт удовлетворяется, если удовлетворяются его синтаксические требования, и моделируется, если он удовлетворяется, и его семантические требования (если таковые имеются) также выполняются.

Как правило, компилятор может проверить только синтаксические требования. Если достоверность или значение программы зависит от того, моделирует ли последовательность аргументов шаблона концепт, и концепт удовлетворяется, но не моделируется, или если семантическое требование не выполняется в точке использования, программа некорректна, диагностика не требуется.

Содержание

[править]Сохранение равенства

Выражение является сохраняющим равенство, если оно приводит к равным результатам при равных входных данных, где

  • входные данные состоят из его операндов (не обязательно делая выражение семантически правильным), и
  • выходные данные состоят из его результата и всех модификаций операндов выражением, если таковые имеются

где для удобства формулировки его "операнды" относятся к его самым большим подвыражениям, состоящим из выражения-идентификатора или вызовов std::move, std::forward и std::declval.

Cv-квалификация и категория значения каждого операнда определяются в предположении, что каждый параметр типа шаблона обозначает полный тип объекта, не являющийся массивом, без cv-квалификации.

Каждое выражение, которое должно сохранять равенство, также должно быть стабильным, то есть две его оценки с одними и теми же входными объектами должны иметь одинаковые выходные данные без какой-либо явной промежуточной модификации этих входных объектов.

Если не указано иное, каждое выражение, используемое в выражении requiresконцептах стандартной библиотеки должно сохранять равенство, и оценка выражения может изменить только его неконстантные операнды. Константные операнды не должны изменяться.

В стандартной библиотеке следующие концепты могут иметь выражения requires, не сохраняющие равенство: output_iterator, indirectly_writable, invocable (но не regular_invocable), weakly_incrementable (но не incrementable), range (но не forward_range) и некоторые другие.

Концепты стандартной библиотеки (начиная с C++20)

Определены в пространстве имён std
Основные языковые концепты
Определены в заголовочном файле <concepts>
(C++20)
указывает, что тип совпадает с другим типом
(концепт)[править]
указывает, что тип является производным от другого типа
(концепт)[править]
указывает, что тип неявно преобразуется в другой тип
(концепт)[править]
указывает, что два типа имеют общий ссылочный тип
(концепт)[править]
указывает, что два типа имеют общий тип
(концепт)[править]
(C++20)
указывает, что тип является целым типом
(концепт)[править]
указывает, что тип является целочисленным типом со знаком
(концепт)[править]
указывает, что тип является целым беззнаковым типом
(концепт)[править]
указывает, что тип, это число с плавающей точкой
(концепт)[править]
указывает, что типу может быть присвоен другой тип
(концепт)[править]
указывает, что тип можно обменять или что два типа можно обменять друг с другом
(концепт)[править]
указывает, что объект данного типа может быть уничтожен
(концепт)[править]
указывает, что переменная типа может быть создана из набора или привязана к типам аргументов
(концепт)[править]
указывает, что объект типа может быть сконструирован по умолчанию
(концепт)[править]
указывает, что объект типа может быть сконструирован перемещением
(концепт)[править]
указывает, что объект типа может быть создан копированием и перемещением
(концепт)[править]
Концепты сравнения
Определены в заголовочном файле <concepts>
указывает, что тип может использоваться в логических контекстах
(только для пояснения concept*)[править]
указывает, что оператор == является отношением эквивалентности
(концепт)[править]
указывает, что операторы сравнения для типа дают общий порядок
(концепт)[править]
Определены в заголовочном файле <compare>
указывает, что оператор <=> даёт согласованный результат для данных типов
(концепт)[править]
Концепты объекта
Определены в заголовочном файле <concepts>
(C++20)
указывает, что объект типа можно перемещать и менять местами
(концепт)[править]
(C++20)
указывает, что объект типа можно копировать, перемещать и менять местами
(концепт)[править]
указывает, что объект типа можно копировать, перемещать, менять местами и создавать по умолчанию
(концепт)[править]
(C++20)
указывает, что тип является регулярным, то есть одновременно semiregular и equality_comparable
(концепт)[править]
Вызываемые концепты
Определены в заголовочном файле <concepts>
указывает, что вызываемый тип может быть вызван с заданным набором типов аргументов
(концепт)[править]
(C++20)
указывает, что вызываемый тип является логическим предикатом
(концепт)[править]
(C++20)
указывает, что вызываемый тип является бинарным отношением
(концепт)[править]
указывает, что relation накладывает отношение эквивалентности
(концепт)[править]
указывает, что relation налагает строгий слабый порядок
(концепт)[править]

Точки кастомизации объектов

обменивает значения двух объектов
(объект точки настройки)[править]

Дополнительные концепты можно найти в библиотеке итераторов, библиотеке алгоритмов и библиотеке диапазонов.

[править]Смотрите также

close