std::optional<T>::swap
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
void swap( optional& other ) noexcept(/* смотрите ниже */); |
(начиная с C++17) (до C++20) |
|
constexpr void swap( optional& other ) noexcept(/* смотрите ниже */); |
(начиная с C++20) | |
Меняет содержимое местами с other.
- Если ни
*this, ниotherне содержат значения, функция не имеет эффекта.
- Если только один из
*thisиotherсодержит значение (назовём этот объектin, а другойun), содержащееся значениеunинициализируется напрямую изstd::move(*in), с последующим уничтожением содержащегося вinзначения, как если быin->T::~T(). После этого вызоваinне содержит значения;unсодержит значение.
- Если и
*this, иotherсодержат значения, содержащиеся значения обмениваются вызовомusing std::swap; swap(**this, *other).Tзначения lvalue должны соответствовать Swappable.
Программа некорректна, если std::is_move_constructible_v<T> равно false.
Параметры
| other | — | объект optional для обмена содержимым
|
Возвращаемое значение
(нет)
Исключения
спецификация noexcept:
noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_swappable_v<T>)В случае сгенерированного исключения состояния содержащихся значений *this и other определяются гарантиями безопасности исключения swap типа T или конструктора перемещения T, в зависимости от того, что вызывается. Как для *this, так и для other, если объект содержит значение, он остаётся со значением, и наоборот.
Пример
Запустить этот код
#include <iostream>
#include <string>
#include <optional>
int main()
{
std::optional<std::string> opt1("Текст первого примера");
std::optional<std::string> opt2("2-й текст");
enum Swap { Before, After };
auto print_opts = [&](Swap e) {
std::cout << (e == Before ? "Перед обменом:\n" : "После обмена:\n");
std::cout << "opt1 содержит '" << opt1.value_or("") << "'\n";
std::cout << "opt2 содержит '" << opt2.value_or("") << "'\n";
std::cout << (e == Before ? "---ОБМЕН---\n": "\n");
};
print_opts(Before);
opt1.swap(opt2);
print_opts(After);
// Обмен только с 1 набором
opt1 = "Lorem ipsum dolor sit amet, consectetur tincidunt.";
opt2.reset();
print_opts(Before);
opt1.swap(opt2);
print_opts(After);
}
Вывод:
Перед обменом:
opt1 содержит 'Текст первого примера'
opt2 содержит '2-й текст'
---ОБМЕН---
После обмена:
opt1 содержит '2-й текст'
opt2 содержит 'Текст первого примера'
Перед обменом:
opt1 содержит 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
opt2 содержит ''
---ОБМЕН---
После обмена:
opt1 содержит ''
opt2 содержит 'Lorem ipsum dolor sit amet, consectetur tincidunt.'
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| WG не указан | C++20 | swap не была constexpr, в то время как необходимые операциимогут быть constexpr в C++20 |
сделана constexpr |
Смотрите также
(C++17) |
специализация алгоритма std::swap (шаблон функции) |