(C++'s STL concept:)
A C++ type is Assignable if it can be assigned and copied. Specifically, it has a copy constructor and an assignment operator (
operator=) with the "usual" semantics. The standard
swap function will therefore work for it, with the "usual" semantics.
In fact, the C++ templated
swap function uses only the copy constructor and assignments. So if the class has appropriate copy constructor and assignment operator, it is of necessity "swappable" (and with no further effort by the programmer). However, some classes may have more efficient swap operations. For instance, any STL container has a
swap method which is more efficient. If class
C has such a method, it makes sense to define
to get a more efficient operation. An additional requirement (since STL algorithms use
template<> swap(C& a, C& b)
swap) is that
swap too have its "usual" semantics.
The model for Assignable is
int, but any of the builtin data types (i.e. excluding void) will do. Pointers also qualify, if you consider what pointer assignment does to be the creation of a copy. Most classes with
operator= and a copy constructor (or even the default copy constructor) will also do.
As a nonexample, any
auto_ptr<T> is not Assignable (after an assignment
x is not a copy of
y no longer owns the block of memory).
Most STL containers demand that they hold an Assignable type. In particular, anything like
vector<auto_ptr<T> > is wrong.