C++ named requirements:ValueSwappable
Two objects of this type can be dereferenced and the resulting values can be swapped using unqualified function call swap()
Two objects of this type can be dereferenced and the resulting values can be swapped using unqualified function call swap()
Two objects of this type can be dereferenced and the resulting values can be swapped using unqualified function call swap()