【发布时间】:2019-05-23 20:20:03
【问题描述】:
我遇到了以下代码:
class X {
std::vector<int> m_v;
public:
X(std::vector<int>&& v) : m_v(std::move(v)) {
};
参数 v 已经是一个右值引用 - 那么为什么我们需要对它应用 std::move 呢?
【问题讨论】:
-
v被命名为对象。每个命名对象都是左值。您需要使用move将Lvalue转换为Rvalue引用,然后才能调用vector的move构造函数。 -
谢谢,但那是一个动作演员。它只为右值调用,不能为左值调用。左值是怎么产生的??
-
考虑这个代码
vector<int> v; X x{move(v)};所以move(v)是右值 - 临时的?不,它将 Lvalue 转换为 Rvalue 引用(严格来说它是 Xvalue)。现在在X的 ctor 中,您可以决定是要复制v还是移动它:m_v(v)进行复制,但这个m_v(move(v))移动。 -
好吧...让我们考虑 m_v(v)。 v 的类型是 std::vector
&& 即右值引用。所以 m_v(v) 使用 move-ctor,而不是 copy-ctor。这很明显,不是吗? -
所以试试这段代码,看看移动矢量的内容,它会保持不变。因为会复制。测试一下。
标签: c++11 move-semantics