为什么要在移动构造函数中移动右值引用?

时间:2019-05-23 20:20:03

标签: c++11 move-semantics

我遇到了以下代码:

class X {
    std::vector<int> m_v;
public:
    X(std::vector<int>&& v) : m_v(std::move(v)) {

};

Parametet v已经是一个右值引用-那么为什么我们需要对其应用std :: move?

1 个答案:

答案 0 :(得分:0)

简而言之:每个命名对象都是 Lvalue ,即使v是Rvalue的引用,您也需要使用move来强制调用ctor。

From reference - value categories

  

即使变量的类型是右值引用,表达式   由其名称组成的是左值表达式;

现在您的数据成员m_v是向量,其中包含复制和移动构造函数。 接下来的句子描述了哪个叫reference

  

如果同时提供了复制和移动构造函数,则没有其他   构造函数是可行的,重载分辨率可以选择   构造函数,如果参数是相同类型的右值(xvalue   例如std :: move的结果或prvalue(例如无名)的结果   临时(直到C ++ 17)),如果   参数是左值(返回的命名对象或函数/运算符   左值参考)。

所以当您写:

m_v(std::move(v)) // move ctor is called because you are passing Xvalue

但是在这里:

m_v(v) // copy ctor is called because v as named object is passed