Namespaces
Variants

std::experimental::ranges:: Assignable

From cppreference.net
Определено в заголовке <experimental/ranges/concepts>
template < class T, class U >

concept bool Assignable =
std:: is_lvalue_reference < T > :: value &&
CommonReference <
const std:: remove_reference_t < T > & ,
const std:: remove_reference_t < U > & > &&
requires ( T t, U && u ) {
{ t = std:: forward < U > ( u ) } - > Same < T > && ;

} ;
(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 > ).