我遇到了以下代码:
class X {
std::vector<int> m_v;
public:
X(std::vector<int>&& v) : m_v(std::move(v)) {
};
Parametet v已经是一个右值引用-那么为什么我们需要对其应用std :: move?
答案 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