Defined in header <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>; }; | (since C++20) |
The concept assignable_from<LHS, RHS>
specifies that an expression of the type and value category specified by RHS
can be assigned to an lvalue expression whose type is specified by LHS
.
Given.
lhs
, an lvalue that refers to an object lcopy
such that decltype((lhs))
is LHS
, rhs
, an expression such that decltype((rhs))
is RHS
, rcopy
, a distinct object that is equal to rhs
, assignable_from<LHS, RHS>
is modeled only if.
std::addressof(lhs = rhs) == std::addressof(lcopy)
(i.e., the assignment expression yields an lvalue referring to the left operand); lhs = rhs
: lhs
is equal to rcopy
, unless rhs
is a non-const xvalue that refers to lcopy
(i.e., the assignment is a self-move-assignment), rhs
is a glvalue: Expressions declared in requires-expressions of the standard library concepts are required to be equality-preserving (except where stated otherwise).
Assignment need not be a total function. In particular, if assigning to some object x
can cause some other object y
to be modified, then x = y
is likely not in the domain of =
. This typically happens if the right operand is owned directly or indirectly by the left operand (e.g., with smart pointers to nodes in a node-based data structure, or with something like std::vector<std::any>
).
(C++11)(C++11)(C++11) | checks if a type has an assignment operator for a specific argument (class template) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/concepts/assignable_from