我应该将值移出可选还是移动整个可选?
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);
让我走了:“嗯,我正在取消引用,我有一个像大多数取消引用一样的左值,还是我真的有一个右值?”我宁愿不必问自己这个问题。
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);
让我走了:“嗯,我正在取消引用,我有一个像大多数取消引用一样的左值,还是我真的有一个右值?”我宁愿不必问自己这个问题。