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>; }; |
||
Концепт 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>).
Смотри также
(C++11)(C++11)(C++11) |
проверяет, есть ли у типа оператор присваивания для определённого аргумента (шаблон класса) |