为什么移动向量不触发移动内部元素?

Zac*_*ack 2 c++

对于下面的代码,我对 p3 向量感到困惑,为什么测试时没有触发移动运算符?对于p1和p2,我可以理解为所有元素都需要复制结束。

这是否意味着当我们移动向量时,它会修改向量对象,因此向量的元素将保持不变。而当我们复制向量时,我们必须复制每个元素。是否有向量运算会触发元素的移动运算符?

#include <iostream>
#include <vector> 

using namespace std;

class Test {
  public: 
    Test(int a) {
        std::cout << " default " << std::endl;
    }
    
    Test(const Test& o) {
        std::cout << " copy ctor " << std::endl;
    }
    
    Test& operator=(const Test& o) {
        std::cout << " copy assign " << std::endl;
        return *this;
    }
    
    Test(Test&& o) {
        std::cout << " move ctor" << std::endl;
    }
    
    Test& operator=(Test&& o) {
        std::cout << " move assign " << std::endl;
        return *this;
    }
};

int main()
{
  std::cout << " p: " << std::endl;
  std::vector<Test> p = {Test(0), Test(0)}; 
  std::cout << std::endl;
   
  std::cout << " vec p1 " << std::endl;
  std::vector<Test> p1 = p;
  std::cout << std::endl;
    
  std::cout << " vec p2 " << std::endl;
  std::vector<Test> p2;
  p2.reserve(2);
  p2.emplace_back(0);
  p2.emplace_back(0);
  std::cout << std::endl;
   
  std::cout << " vec p3 " << std::endl;
  std::vector<Test> p3 = std::move(p);
}
Run Code Online (Sandbox Code Playgroud)

输出:

p: 
default 
default 
copy ctor 
copy ctor 

vec p1 
copy ctor 
copy ctor 

vec p2 
default 
default 

vec p3 
Run Code Online (Sandbox Code Playgroud)

Ala*_*les 8

向量本质上是一个指向数组的指针。移动向量只是交换两个向量之间的数组指针,数组本身不变。