std:: assignable_from
|
Определено в заголовочном файле
<concepts>
|
||
|
template
<
class
LHS,
class
RHS
>
concept assignable_from
=
|
(начиная с 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 выражениях концепций стандартной библиотеки, должны быть equality-preserving (если не указано иное).
Примечания
Присваивание не обязано быть тотальной функцией. В частности, если присваивание некоторому объекту
x
может привести к изменению другого объекта
y
, то
x
=
y
вероятно не принадлежит области определения
=
. Обычно это происходит, если правый операнд прямо или косвенно принадлежит левому операнду (например, при работе с умными указателями на узлы в узловой структуре данных, или с такими конструкциями как
std::
vector
<
std::
any
>
).
Пример
#include <atomic> #include <concepts> #include <string> int main() { // Обычное базовое использование, проверяет присваивание по lvalue-ссылке static_assert(std::is_assignable_v<int&, int>); static_assert(std::assignable_from<int&, int>); static_assert(std::is_assignable_v<std::string&, std::string>); static_assert(std::assignable_from<std::string&, std::string>); // Фундаментальные типы не поддерживают присваивание rvalue static_assert(!std::is_assignable_v<int, int>); static_assert(!std::assignable_from<int, int>); // std::assignable_from не принимает все допустимые выражения присваивания: // присваивание по rvalue-ссылке static_assert(std::is_assignable_v<std::string&&, std::string>); static_assert(!std::assignable_from<std::string&&, std::string>); // присваивание rvalue static_assert(std::is_assignable_v<std::string, std::string>); static_assert(!std::assignable_from<std::string, std::string>); // std::atomic::operator= возвращает по значению static_assert(std::is_assignable_v<std::atomic<int>&, int>); static_assert(!std::assignable_from<std::atomic<int>&, int>); }
Ссылки
- Стандарт C++23 (ISO/IEC 14882:2024):
-
-
18.4.8 Концепт
assignable_from[concept.assignable]
-
18.4.8 Концепт
- Стандарт C++20 (ISO/IEC 14882:2020):
-
-
18.4.8 Концепт
assignable_from[concept.assignable]
-
18.4.8 Концепт
Смотрите также
|
(C++11)
(C++11)
(C++11)
|
проверяет, имеет ли тип оператор присваивания для конкретного аргумента
(шаблон класса) |