std::experimental::ranges:: Assignable
|
Определено в заголовке
<experimental/ranges/concepts>
|
||
|
template
<
class
T,
class
U
>
concept
bool
Assignable
=
|
(ranges TS) | |
Концепт
Assignable<T, U>
определяет, что выражение типа и категории значения, заданных
U
, может быть присвоено lvalue-выражению, тип которого задан
T
.
Дано
-
t, lvalue типа std:: remove_reference_t < T > , ссылающийся на объектo, -
u, выражение, для которого decltype ( ( u ) ) являетсяU, -
u2, отдельный объект, равныйu,
Assignable<T, U>
удовлетворяется только если
- std:: addressof ( t = u ) == std:: addressof ( o ) (т.е. выражение присваивания возвращает lvalue, ссылающееся на левый операнд);
-
После вычисления
t
=
u
:
-
tравноu2, за исключением случая, когдаuявляется неконстантной xvalue, ссылающейся наo(т.е. присваивание является самоприсваиванием перемещением), -
если
uявляется glvalue:- Если это неконстантная xvalue, объект, на который она ссылается, находится в допустимом, но неопределённом состоянии;
- В противном случае объект, на который она ссылается, не изменяется;
-
Между
Assignable<T, U>
и
std::
is_lvalue_reference
<
T
>
::
value
не обязательно должно быть отношение включения.
Сохранение равенства
Выражение называется сохраняющим равенство если оно даёт равные результаты при равных входных данных.
- Входные данные выражения состоят из его операндов.
- Выходные данные выражения состоят из его результата и всех операндов, изменённых выражением (если таковые имеются).
Каждое выражение, которое должно сохранять равенство, дополнительно должно быть стабильным : два вычисления такого выражения с одинаковыми входными объектами должны давать равные выходные данные при отсутствии каких-либо явных изменений этих входных объектов между вычислениями.
Если не указано иное, каждое выражение, используемое в requires-expression , должно сохранять равенство и быть стабильным, и вычисление выражения может изменять только свои неконстантные операнды. Операнды, являющиеся константными, не должны изменяться.
Примечания
Ограничение вывода формы
{
expression
}
-
>
Same
<
T
>
&&
фактически требует, чтобы
decltype
(
(
expression
)
)
&&
был точно таким же типом, как
T&&
. Это ограничивает как тип выражения, так и его категорию значения.
Присваивание не обязано быть тотальной функцией. В частности, если присваивание некоторому объекту
x
может привести к изменению другого объекта
y
, то
x
=
y
вероятно не принадлежит области определения
=
. Обычно это происходит, если правый операнд прямо или косвенно принадлежит левому операнду (например, при работе с умными указателями на узлы в узловой структуре данных, или с такими конструкциями как
std::
vector
<
std::
any
>
).