std::experimental::ranges:: exchange

From cppreference.com
template < MoveConstructible T, class U = T >

requires Assignable < T & , U >

constexpr T exchange ( T & obj, U && new_val ) noexcept ( /* see below */ ) ;
(ranges TS)

Replaces the value of obj with new_value and returns the old value of obj , as if by

T old_value = std::move(obj);
obj = std::forward<U>(new_value);
return old_value;

Parameters

obj - object whose value to replace
new_value - the value to assign to obj

Return value

The old value of obj .

Exceptions

noexcept specification:
noexcept ( std:: is_nothrow_move_constructible < T > :: value &&
std:: is_nothrow_assignable < T & , U > :: value )

Example

See also

(C++14)
replaces the argument with a new value and returns its previous value
(function template)