|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||
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] |