Кажется, что можно упростить через std::swap