|
|
|
Defined in header <concepts> | ||
template<class LHS,class RHS> concept assignable_from= | (since C++20) | |
The conceptassignable_from<LHS, RHS>
specifies that an expression of the type and value category specified byRHS
can be assigned to an lvalue expression whose type is specified byLHS
.
Contents |
Given
lhs
, an lvalue that refers to an objectlcopy
such thatdecltype((lhs)) isLHS
,rhs
, an expression such thatdecltype((rhs)) isRHS
,rcopy
, a distinct object that is equal torhs
,assignable_from<LHS, RHS>
is modeled only if
lhs
is equal torcopy
, unlessrhs
is a non-const xvalue that refers tolcopy
(i.e., the assignment is a self-move-assignment),rhs
is a glvalue:Expressions declared inrequires expressions of the standard library concepts are required to beequality-preserving (except where stated otherwise).
Assignment need not be a total function. In particular, if assigning to some objectx
can cause some other objecty
to be modified, thenx= 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 likestd::vector<std::any>).
#include <atomic>#include <concepts>#include <string> int main(){// Normal basic usage, checks lvalue reference assignment 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>); // Fundamental types don't support assignment to an rvalue static_assert(!std::is_assignable_v<int,int>); static_assert(!std::assignable_from<int,int>); // std::assignable_from doesn't accept all valid assignment expressions: // rvalue reference assignment static_assert(std::is_assignable_v<std::string&&,std::string>); static_assert(!std::assignable_from<std::string&&,std::string>); // rvalue assignment static_assert(std::is_assignable_v<std::string,std::string>); static_assert(!std::assignable_from<std::string,std::string>); // std::atomic::operator= returns by value static_assert(std::is_assignable_v<std::atomic<int>&,int>); static_assert(!std::assignable_from<std::atomic<int>&,int>);}
assignable_from
[concept.assignable] assignable_from
[concept.assignable] (C++11)(C++11)(C++11) | checks if a type has an assignment operator for a specific argument (class template)[edit] |