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

std::assignable_from

Материал из cppreference.com
 
 
 
<tbody> </tbody>
Определено в заголовочном файле <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>).

Смотри также

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