std::swap

Header: <algorithm> (until C++11)

Exchanges the given values.

# Declarations

template< class T >
void swap( T& a, T& b );

(conditionally noexcept since C++11)(constexpr since C++20)

template< class T2, std::size_t N >
void swap( T2 (&a)[N], T2 (&b)[N] );

(conditionally noexcept since C++11)(constexpr since C++20)

# Parameters

# Return value

(none)

# Example

#include <algorithm>
#include <iostream>
 
namespace Ns
{
    class A
    {
        int id {};
 
        friend void swap(A& lhs, A& rhs)
        {
            std::cout << "swap(" << lhs << ", " << rhs << ")\n";
            std::swap(lhs.id, rhs.id);
        }
 
        friend std::ostream& operator<<(std::ostream& os, A const& a)
        {
            return os << "A::id=" << a.id;
        }
 
    public:
        A(int i) : id {i} {}
        A(A const&) = delete;
        A& operator = (A const&) = delete;
    };
}
 
int main()
{
    int a = 5, b = 3;
    std::cout << a << ' ' << b << '\n';
    std::swap(a, b);
    std::cout << a << ' ' << b << '\n';
 
    Ns::A p {6}, q {9};
    std::cout << p << ' ' << q << '\n';
//  std::swap(p, q); // error, type requirements are not satisfied
    swap(p, q);      // OK, ADL finds the appropriate friend `swap`
    std::cout << p << ' ' << q << '\n';
}

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
LWG 227C++98T was not required to be CopyConstructible or DefaultConstructible(a temporary object of type T might not be able to be constructed)T is also required tobe CopyConstructible
LWG 809C++98arrays could not be swappedadded overload (2)
LWG 2554C++11swapping multi-dimensional arrays can neverbe noexcept due to name lookup problemsmade to work

# See also