【发布时间】:2019-07-23 21:35:46
【问题描述】:
我对在下面的代码中使用std::move() 感到困惑:
如果我在 (2) 处取消注释行,输出将是:1 2 3 但如果我在 (1) 处取消注释行,输出将什么都不是,这意味着 std::vector 的移动构造函数被调用!
为什么我们必须在 (1) 处再次调用 std::move 才能调用 std::vector 的移动构造函数?
我的理解是std::move得到了它的参数r-value,那么为什么我们必须在(1)处得到r-value的r-value呢?
我认为 (2) 处的这条线 _v = rv; 更合乎逻辑,应该使 std::vector 移动构造函数在没有 std::move 的情况下被调用,因为 rv 本身首先是 r-value 引用。
template <class T>
class A
{
public:
void set(std::vector<T> & lv)
{
}
void set(std::vector<T> && rv)
{
//_v = std::move(rv); (1)
//_v = rv; (2)
}
private:
std::vector<T> _v;
};
int main()
{
std::vector<int> vec{1,2,3};
A<int> a;
a.set(std::move(vec));
for(auto &item : vec)
cout << item << " ";
cout << endl;
return 0;
}
【问题讨论】:
标签: c++ c++11 c++14 move stdmove