В зависимости от типа, обмен может быть дороже, чем переадресация (в С++ 98 простое назначение). Стандартная библиотека не имеет способа обнаружить эти случаи. По крайней мере, в С++ 11 решение понятно: реализуйте оператор присваивания move для всех классов, где вы реализуете swap.