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

std::assignable_from

Материал из cppreference.com
< cpp‎ | concepts
 
 
 
Определено в заголовочном файле <concepts>
template< class LHS, class RHS >

concept assignable_from =
  std::is_lvalue_reference_v<LHS> &&
  std::common_reference_with<
    const std::remove_reference_t<LHS>&,
    const std::remove_reference_t<RHS>&> &&
  requires(LHS lhs, RHS&& rhs) {
    { lhs = std::forward<RHS>(rhs) } -> std::same_as<LHS>;

  };

Концепт assignable_from<LHS, RHS> определяет, что выражение типа и категории значения, определёные как RHS, может быть присвоено выражению lvalue, тип которого определяется LHS.

Содержание

[править] Семантические требования

Даны:

  • lhs, левостороннее значение которое ссылается на объект lcopy, такой, что decltype((lhs)) является LHS,
  • rhs, такое выражение, что decltype((rhs)) является RHS,
  • rcopy, отдельный объект, равнозначный rhs,

assignable_from<LHS, RHS> моделируется только если

  • std::addressof(lhs = rhs) == std::addressof(lcopy) (т.е. выражение присваивания возвращает левостороннее значение относящееся к левому операнду);
  • После вычисления lhs = rhs:
    • lhs равно rcopy, если только rhs не является константным xvalue, которое ссылается на lcopy (т.е. присваивание является самоприсваиванием перемещением),
    • если rhs является glvalue:
      • Если оно не является неконстантным xvalue, объект, на который оно ссылается, находится в допустимом, но неопределённом состоянии;
      • Иначе, объект, на который оно ссылается не изменился;

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

Выражения, объявленные в выражениях requires концептов стандартной библиотеки, должны сохранять равенство (если не указано иное).

[править] Примечание

Присваивание не обязательно должно быть общей функцией. В частности, если присваивание какому-либо объекту x может изменить другой объект y, тогда x = y скорее всего не в сфере =. Обычно это происходит, если левый операнд прямо или косвенно принадлежит правому операнду (например, с умными указателями на узлы в структуре данных на основе узлов или с чем-то вроде std::vector<std::any>).

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

проверяет, есть ли у типа оператор присваивания для определённого аргумента
(шаблон класса) [править]