std::swap(std::variant)
定义于头文件 <variant>
。
声明
C++17
template <class... Types>
void swap( std::variant<Types...>& lhs,
std::variant<Types...>& rhs ) noexcept(/* see below */);
C++20
template <class... Types>
constexpr void swap( std::variant<Types...>& lhs,
std::variant<Types...>& rhs ) noexcept(/* see below */);
重载 std::variant 的 std::swap
算法。实际上调用 lhs.swap(rhs)
。
此重载仅在 Types...
中的所有 T_i
都满足 std::is_move_constructible_v<T_i>
和 std::is_swappable_v<T_i>
为 true 时才参与重载决议
参数
lhs
, rhs
- 要交换值的 variant 对象
返回值
(无)
异常
noexcept 规范
noexcept(noexcept(lhs.swap(rhs)))
示例
#include <variant>
#include <string>
#include <iostream>
auto print = [](auto const& v, char term = '\n') {
std::visit([](auto&& o) { std::cout << o; }, v);
std::cout << term;
};
int main()
{
std::variant<int, std::string> v1{123}, v2{"XYZ"};
print(v1, ' ');
print(v2);
std::swap(v1, v2);
print(v1, ' ');
print(v2);
std::variant<double, std::string> v3{3.14};
// std::swap(v1, v3); // ERROR: ~ inconsistent parameter packs
}
结果
123 XYZ
XYZ 123
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
P2231R1 | C++20 | swap 在 C++20 中不是 constexpr,而所需的运算可以是 constexpr | 变为 constexpr |