#include class some_big_object { }; void swap(some_big_object& lhs, some_big_object& rhs) { } class X { private: some_big_object some_detail; mutable std::mutex m; public: X(some_big_object const& sd) : some_detail(sd) {} friend void swap(X& lhs, X& rhs) { if (&lhs == &rhs) return; std::unique_lock lock_a(lhs.m, std::defer_lock); std::unique_lock lock_b(rhs.m, std::defer_lock); std::lock(lock_a, lock_b); swap(lhs.some_detail, rhs.some_detail); } }; int main() { }