我应该将值移出可选还是移动整个可选?

Should I move the value out of an optional or move the whole optional?

std::move(*optional)*std::move(optional)之间有有效的区别吗?哪个更好?

完整示例:

#include <optional>
#include <vector>

void foo()
{
    std::optional<std::vector<int>> ov = std::vector<int>{};
    std::vector<int> v;
    v = std::move(*ov);
}

void bar()
{
    std::optional<std::vector<int>> ov = std::vector<int>{};
    std::vector<int> v;
    v = *std::move(ov);
}

他们做同样的事情。

v = std::move(*ov); 中,*ov 是一个 std::vector<int>&,所以 std::move(*ov) 给你一个 std::vector<int>&&,你正试图分配给 v .

v = *std::move(ov);ov 是一个 std::optional<std::vector<int>> 所以 std::move(ov) 给你一个 std::optional<std::vector<int>>&& 并调用 * 调用 constexpr T&& operator*() && noexcept; 所以你又得到了一个 std::vector<int>&&,你正试图分配给 v

我个人更喜欢 v = std::move(*ov);,因为 v = *std::move(ov); 让我走了:“嗯,我正在取消引用,我有一个像大多数取消引用一样的左值,还是我真的有一个右值?”我宁愿不必问自己这个问题。