|
| |
|
| Category: utilities | | Component type: concept |
Description
A type is Assignable if it is possible to copy objects of that type and to assign values to variables.
Refinement of
Associated types
Notation
X | A type that is a model of Assignable |
x, y | Object of type X |
Definitions
Valid expressions
| Name | Expression | Type requirements | Return type |
| Copy constructor | X(x) | | X |
| Copy constructor |
X x(y);
X x = y;
| | |
| Assignment | x = y [1] | | X& |
| Swap | swap(x,y) | | void |
Expression semantics
| Name | Expression | Precondition | Semantics | Postcondition |
| Copy constructor | X(x) | | | X(x) is a copy of x [2] |
| Copy constructor | X(x) | | | X(x) is a copy of x [2] |
| Copy constructor |
X x(y);
X x = y;
| | | x is a copy of y [2] |
| Assignment | x = y [1] | | | x is a copy of y [2] |
| Swap | adobe::swap(x,y)[3] | | Equivalent to
{
X tmp = x;
x = y;
y = tmp;
}
| |
Complexity guarantees
Invariants
Models
Notes
[1] One implication of this requirement is that a const type is not Assignable. For example, const int is not Assignable: if x is declared to be of type const int, then x = 7 is illegal. Similarly, the type pair<const int, int> is not Assignable.
[2] The reason this says "x is a copy of y", rather than "x == y", is that operator== is not necessarily defined: equality is not a requirement of Assignable. If the type X is EqualityComparable as well as Assignable, then a copy of x should compare equal to x.
[3] swap will not throw an exception for an assignable type. For types with remote parts, swap must be specialized to swap the remote parts. Please see the documentation on adobe::swap for more information.
[4] If assignment can throw an exception it must leave the value being assigned to untouched. For types with remote parts, this can be accomplished by implementing assignment as copy constructing a temp, and then swapping the temp with the value being assigned to. See the note adobe::swap().
See also
DefaultConstructible