#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::lock(lhs.m, rhs.m); std::lock_guard lock_a(lhs.m, std::adopt_lock); std::lock_guard lock_b(rhs.m, std::adopt_lock); swap(lhs.some_detail, rhs.some_detail); } }; int main() { }