将 std::iter_swap 用于 std::optional

Using std::iter_swap for std::optional

看着 std::iter_swap reference 我得出结论:

struct A {};
std::experimental::optional< A > x{A{}}, y{A{}};
std::iter_swap(x, y);

是合法的。是这样吗?

对参数的要求是 ForwardIterator 意味着,它们应该只满足一个要求:在取消引用(迭代器)后传递的对象应该保持有效(可取消引用?)状态。理解正确吗?

ForwardIterator concept 比你说的更受限制。 您的示例仅在使用类似此实现的情况下才有效:

template<class ForwardIt1, class ForwardIt2>
void iter_swap(ForwardIt1 a, ForwardIt2 b)
{
   using std::swap;
   swap(*a, *b);
}

但由于不能保证您实际上不应该使用 iter_swap 作为可选。你真的应该只使用 swap for optional