std::assignable_from
Определено в заголовочном файле <concepts>
|
||
template< class LHS, class RHS > concept assignable_from = |
||
Концепт 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) |
проверяет, есть ли у типа оператор присваивания для определённого аргумента (шаблон класса) |