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

Ste*_*low 5 c++ move c++17 stdoptional

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);
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 9

他们做同样的事情。

v = std::move(*ov);,*ov是 astd::vector<int>&中,因此std::move(*ov)给您一个std::vector<int>&&您试图分配给的a v

v = *std::move(ov); ov是 a 中std::optional<std::vector<int>>,因此std::move(ov)给您 astd::optional<std::vector<int>>&&并调用*该调用constexpr T&& operator*() && noexcept;,以便您再次拥有std::vector<int>&&要分配给的av

就我个人而言,我更喜欢v = std::move(*ov);asv = *std::move(ov);让我去:“嗯,我正在解引用,我是否有像大多数解引用所给出的左值,或者我真的有右值吗?” 我宁愿不必问自己这个问题。