std::swap(std::optional)
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
| Определено в заголовочном файле <optional>
|
||
template< class T > void swap( std::optional<T>& lhs, std::optional<T>& rhs ) noexcept(/* смотрите ниже */); |
(начиная с C++17) (до C++20) |
|
template< class T > constexpr void swap( std::optional<T>& lhs, std::optional<T>& rhs ) noexcept(/* смотрите ниже */); |
(начиная с C++20) | |
Перегружает алгоритм std::swap для std::optional. Меняет состояние lhs на состояние rhs. Эффективно вызывает lhs.swap(rhs).
Эта перегрузка участвует в разрешении перегрузки, только если std::is_move_constructible_v<T> и std::is_swappable_v<T> равны true.
Параметры
| lhs, rhs | — | объекты optional, состояния которых нужно поменять местами
|
Возвращаемое значение
(нет)
Исключения
спецификация noexcept:
noexcept(noexcept(lhs.swap(rhs)))Пример
Запустить этот код
#include <iostream>
#include <optional>
#include <string>
int main()
{
std::optional<std::string> a{"██████"}, b{"▒▒▒▒▒▒"};
auto print = [&](auto const& s) {
std::cout
<< s << '\t'
<< "a = " << a.value_or("(null)") << " "
<< "b = " << b.value_or("(null)") << '\n';
};
print("Изначально:");
std::swap(a, b);
print("swap(a, b):");
a.reset();
print("\n""a.reset():");
std::swap(a, b);
print("swap(a, b):");
}
Вывод:
Изначально: a = ██████ b = ▒▒▒▒▒▒
swap(a, b): a = ▒▒▒▒▒▒ b = ██████
a.reset(): a = (null) b = ██████
swap(a, b): a = ██████ b = (null)
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| WG не указан | C++20 | swap не была constexpr, в то время как необходимые операции могут бытьconstexpr в C++20 |
сделана constexpr |
Смотрите также
| обменивает содержимое (public функция-элемент) |