std::swap(std::optional)
Определено в заголовке <optional> | ||
|---|---|---|
template< class T >
void swap( std::optional<T>& lhs,
std::optional<T>& rhs ) noexcept(/* see below */);
| (начиная с C++17) (constexpr начиная с 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)))
Примечания
| Макрос проверки функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_optional | 202106L |
(C++20) (DR20) | Полностью constexpr |
Пример
#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("Initially:");
std::swap(a, b);
print("swap(a, b):");
a.reset();
print("\n""a.reset():");
std::swap(a, b);
print("swap(a, b):");
}
Вывод:
Initially: a = ██████ b = ▒▒▒▒▒▒ swap(a, b): a = ▒▒▒▒▒▒ b = ██████ a.reset(): a = (null) b = ██████ swap(a, b): a = ██████ b = (null)
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| P2231R1 | C++20 |
swap не был constexpr, хотя необходимые операции могут быть constexpr в C++20 | сделан constexpr |
См. также
| обменивает содержимое (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/optional/swap2