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>).
См. также
|
(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