References are aliases. If you have two references, calling swap will swap what they are referring to, not the references themselves.
C& r1 = c1; // r1 references c1
C& r2 = c2; // r2 references c2
r1.swap(r2); // same as c1.swap(c2)
And it's not the variables that get swapped, it's what make them logically independent that gets swapped. If a container only consists of a pointer, if you swap that pointer with the pointer of another container, you've effectively swapped the containers. The variables themselves remain.
Concrete example:
typedef std::vector<int> vec;
vec c1;
vec c2;
// fill em up
c1.swap(c2);
/*
A vector, internally, has a pointer to a chunk of memory (and some other stuff).
swap() is going to swap the internal pointer (and other stuff) with the other
container. They are logically swapped.
*/
vec& r1 = c1; // r1 is an alias for c1
vec& r2 = c2; // r2 is an alias for c2
r1.swap(r2); // same as c1.swap(c2). they are now unswapped