Пространства имён
Варианты
Действия

std::tuple::swap

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<tbody> </tbody>
Определено в заголовочном файле <tuple>
void swap( tuple& other ) noexcept(/* смотрите ниже */);
(1) (начиная с C++11)
(constexpr начиная с C++20)
constexpr void swap( const tuple& other ) noexcept(/* смотрите ниже */) const;
(2) (начиная с C++23)

Вызывает swap (которая может быть std::swap или может быть найдена через ADL) для каждого элемента в *this и соответствующего ему элемента в other.

Если какой-либо вызов выбранной функции swap некорректен или не меняет местами соответствующие элементы обоих кортежей, поведение не определено.

(до C++23)

Если какой-либо вызов выбранной функции swap не меняет местами соответствующие элементы обоих кортежей, поведение не определено.

1) Программа некорректна, если (std::is_swappable_v<Types> && ...) не равно true.
2) Программа некорректна, если (std::is_swappable_v<const Types> && ...) не равно true.
(начиная с C++23)

Параметры

other кортеж значений для замены

Возвращаемое значение

(нет)

Исключения

спецификация noexcept:  
noexcept( noexcept(swap(std::declval<T0&>>(), std::declval<T0&>())) && noexcept(swap(std::declval<T1&>>(), std::declval<T1&>())) && noexcept(swap(std::declval<T2&>>(), std::declval<T2&>())) && ... )

В приведённом выше выражении идентификатор swap ищется таким же образом, как и свойство C++17 std::is_nothrow_swappable.

(до C++17)
1)
спецификация noexcept:  
noexcept((std::is_nothrow_swappable_v<Types> && ...))
2)
спецификация noexcept:  
noexcept((std::is_nothrow_swappable_v<const Types> && ...))
(начиная с C++17)

Пример

#include <iostream>
#include <string>
#include <tuple>

int main()
{
    std::tuple<int, std::string, float>
                      p1{42, "АБВГ", 2.71},
                      p2;
    p2 = std::make_tuple(10, "1234", 3.14);

    auto print_p1_p2 = [&](auto rem) {
        std::cout << rem
                  << "p1 = {" << std::get<0>(p1)
                  << ", "     << std::get<1>(p1)
                  << ", "     << std::get<2>(p1) << "}, "
                  << "p2 = {" << std::get<0>(p2)
                  << ", "     << std::get<1>(p2)
                  << ", "     << std::get<2>(p2) << "}\n";
    };

    print_p1_p2("Перед p1.swap(p2): ");
    p1.swap(p2);
    print_p1_p2("После p1.swap(p2): ");
    swap(p1, p2);
    print_p1_p2("После swap(p1, p2): ");
}

Вывод:

Перед p1.swap(p2): p1 = {42, АБВГ, 2.71}, p2 = {10, 1234, 3.14}
После  p1.swap(p2): p1 = {10, 1234, 3.14}, p2 = {42, АБВГ, 2.71}
После swap(p1, p2): p1 = {42, АБВГ, 2.71}, p2 = {10, 1234, 3.14}

Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
LWG 2456 C++11 спецификация noexcept некорректна сделана работающей

Смотрите также

специализация алгоритма std::swap
(шаблон функции) [править]
(C++11)
обменивает содержимое
(public функция-элемент std::pair) [править]