std::experimental::ranges:: StrictTotallyOrdered, std::experimental::ranges:: StrictTotallyOrderedWith
|
Определено в заголовке
<experimental/ranges/concepts>
|
||
|
template
<
class
T
>
concept
bool
StrictTotallyOrdered
=
|
(1) | (ranges TS) |
|
template
<
class
T,
class
U
>
концепт
bool
StrictTotallyOrderedWith
=
|
(2) | (ranges TS) |
StrictTotallyOrdered<T>
определяет, что операторы сравнения
==,!=,<,>,<=,>=
для типа
T
дают результаты, согласованные со
строгим линейным порядком
на
T
.
StrictTotallyOrdered<T>
выполняется только если для lvalue-выражений
a
,
b
и
c
типа
const
std::
remove_reference_t
<
T
>
:
- Ровно одно из выражений bool ( a < b ) , bool ( a > b ) и bool ( a == b ) равно true ;
- Если bool ( a < b ) и bool ( b < c ) оба равны true , тогда bool ( a < c ) равно true ;
- bool ( a > b ) == bool ( b < a )
- bool ( a >= b ) == ! bool ( a < b )
- bool ( a <= b ) == ! bool ( b < a )
StrictTotallyOrderedWith<T, U>
определяет, что операторы сравнения
==,!=,<,>,<=,>=
для (возможно, смешанных) операндов типов
T
и
U
дают результаты, соответствующие строгому полному порядку. Сравнение смешанных операндов дает результаты, эквивалентные сравнению операндов, преобразованных к их общему типу.
Формально,
StrictTotallyOrderedWith<T, U>
выполняется только если, для любой lvalue
t
типа
const
std::
remove_reference_t
<
T
>
и любой lvalue
u
типа
const
std::
remove_reference_t
<
U
>
, и если
C
обозначает
ranges::
common_reference_t
<
const
std::
remove_reference_t
<
T
>
&
,
const
std::
remove_reference_t
<
U
>
&
>
:
- bool ( t < u ) == bool ( C ( t ) < C ( u ) )
- bool ( t > u ) == bool ( C ( t ) > C ( u ) )
- bool ( t <= u ) == bool ( C ( t ) <= C ( u ) )
- bool ( t >= u ) == bool ( C ( t ) >= C ( u ) )
- bool ( u < t ) == bool ( C ( u ) < C ( t ) )
- bool ( u > t ) == bool ( C ( u ) > C ( t ) )
- bool ( u <= t ) == bool ( C ( u ) <= C ( t ) )
- bool ( u >= t ) == bool ( C ( u ) >= C ( t ) )
Сохранение равенства
Выражение называется сохраняющим равенство если оно даёт равные результаты при равных входных данных.
- Входные данные выражения состоят из его операндов.
- Выходные данные выражения состоят из его результата и всех операндов, измененных выражением (если таковые имеются).
Каждое выражение, которое должно сохранять равенство, дополнительно должно быть стабильным : два вычисления такого выражения с одинаковыми входными объектами должны давать равные результаты при отсутствии каких-либо явных изменений этих входных объектов между вычислениями.
Если не указано иное, каждое выражение, используемое в requires-expression , должно быть сохраняющим равенство и стабильным, и вычисление выражения может изменять только свои неконстантные операнды. Операнды, являющиеся константными, не должны изменяться.
Вариации неявных выражений
Выражение requires-expression , использующее выражение, которое является немодифицирующим для некоторого константного lvalue операнда, также неявно требует дополнительных вариаций этого выражения, принимающих неконстантный lvalue или (возможно константный) rvalue для данного операнда, если только такая вариация выражения не требуется явно с отличающейся семантикой. Эти неявные вариации выражений должны удовлетворять тем же семантическим требованиям, что и объявленное выражение. Степень, в которой реализация проверяет синтаксис вариаций, не определена.