Spec-Zone.ru › C++

std::assignable_from

Определено в заголовке <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>;
    };
(с C++20)

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

Семантические требования

Дано

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

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

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

Сохранение равенства

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

Примечания

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

См. также

is_assignableis_trivially_assignableis_nothrow_assignable
(C++11)(C++11)(C++11)
проверяет, имеет ли тип оператор присваивания для определенного аргумента
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/concepts/assignable_from

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API