Библиотека концептов (начиная с C++20)
Библиотека концептов предоставляет определения основных концептов библиотеки, которые можно использовать для выполнения проверки аргументов шаблона во время компиляции и выполнения диспетчеризации функций на основе свойств типов. Эти концепты обеспечивают основу для логического мышления в программах.
Большинство концептов стандартной библиотеки налагают как синтаксические, так и семантические требования. Говорят, что стандартный концепт удовлетворяется, если удовлетворяются его синтаксические требования, и моделируется, если он удовлетворяется, и его семантические требования (если таковые имеются) также выполняются.
Как правило, компилятор может проверить только синтаксические требования. Если достоверность или значение программы зависит от того, моделирует ли последовательность аргументов шаблона концепт, и концепт удовлетворяется, но не моделируется, или если семантическое требование не выполняется в точке использования, программа некорректна, диагностика не требуется.
Содержание |
[править]Сохранение равенства
Выражение является сохраняющим равенство, если оно приводит к равным результатам при равных входных данных, где
- входные данные состоят из его операндов (не обязательно делая выражение семантически правильным), и
- выходные данные состоят из его результата и всех модификаций операндов выражением, если таковые имеются
где для удобства формулировки его "операнды" относятся к его самым большим подвыражениям, состоящим из выражения-идентификатора или вызовов 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) | указывает, что тип является производным от другого типа (концепт) |
(C++20) | указывает, что тип неявно преобразуется в другой тип (концепт) |
(C++20) | указывает, что два типа имеют общий ссылочный тип (концепт) |
(C++20) | указывает, что два типа имеют общий тип (концепт) |
(C++20) | указывает, что тип является целым типом (концепт) |
(C++20) | указывает, что тип является целочисленным типом со знаком (концепт) |
(C++20) | указывает, что тип является целым беззнаковым типом (концепт) |
(C++20) | указывает, что тип, это число с плавающей точкой (концепт) |
(C++20) | указывает, что типу может быть присвоен другой тип (концепт) |
(C++20) | указывает, что тип можно обменять или что два типа можно обменять друг с другом (концепт) |
(C++20) | указывает, что объект данного типа может быть уничтожен (концепт) |
(C++20) | указывает, что переменная типа может быть создана из набора или привязана к типам аргументов (концепт) |
(C++20) | указывает, что объект типа может быть сконструирован по умолчанию (концепт) |
(C++20) | указывает, что объект типа может быть сконструирован перемещением (концепт) |
(C++20) | указывает, что объект типа может быть создан копированием и перемещением (концепт) |
Концепты сравнения | |
Определены в заголовочном файле <concepts> | |
(C++20) | указывает, что тип может использоваться в логических контекстах (только для пояснения concept*) |
указывает, что оператор == является отношением эквивалентности (концепт) | |
указывает, что операторы сравнения для типа дают общий порядок (концепт) | |
Определены в заголовочном файле <compare> | |
указывает, что оператор <=> даёт согласованный результат для данных типов (концепт) | |
Концепты объекта | |
Определены в заголовочном файле <concepts> | |
(C++20) | указывает, что объект типа можно перемещать и менять местами (концепт) |
(C++20) | указывает, что объект типа можно копировать, перемещать и менять местами (концепт) |
(C++20) | указывает, что объект типа можно копировать, перемещать, менять местами и создавать по умолчанию (концепт) |
(C++20) | указывает, что тип является регулярным, то есть одновременно semiregular и equality_comparable (концепт) |
Вызываемые концепты | |
Определены в заголовочном файле <concepts> | |
(C++20) | указывает, что вызываемый тип может быть вызван с заданным набором типов аргументов (концепт) |
(C++20) | указывает, что вызываемый тип является логическим предикатом (концепт) |
(C++20) | указывает, что вызываемый тип является бинарным отношением (концепт) |
(C++20) | указывает, что relation накладывает отношение эквивалентности (концепт) |
(C++20) | указывает, что relation налагает строгий слабый порядок (концепт) |
Точки кастомизации объектов | |
(C++20) | обменивает значения двух объектов (объект точки настройки) |
Дополнительные концепты можно найти в библиотеке итераторов, библиотеке алгоритмов и библиотеке диапазонов.