为什么当函数参数引用右值引用时,此处未调用move构造函数?

时间:2019-08-08 17:46:13

标签: c++ c++11 rvalue-reference

在我看来,这些是该程序应该发生的事情
 1. Int i(i)->创建一个新的Int对象,调用副本ctor。
 2. print(std :: move(i))->从i中创建一个右值引用,然后将其分配给a,并在此过程中调用move ctor。  3. cout“ print 1”。
 4. cout“ main func -1”,因为移动ctor掠夺了它的资源。

所以我对输出的期望是:

  

ctor
  移动ctor
  打印1
  主要功能-1

但是,从未调用move ctor。 这是实际看到的输出:

  

ctor
  打印2
  主要功能2

class Int {  
 public:  
  Int(int i) : i_(i) { std::cout << "ctor" << std::endl; }  
  Int(const Int& other) {  
    std::cout << "copy ctor " << std::endl;  
    i_ = other.i_;  
  }  

  Int(Int&& other) {  
    std::cout << "move ctor " << std::endl;  
    i_ = other.i_;  
    // Pillage the other's resource by setting its value to -1.
    other.i_ = -1;   
  }  
  int i_;   
};  

void print(Int&& a) { std::cout << "print " << a.i_ << std::endl; }  

int main() {  
  Int i(1);  
  print(std::move(i));  
  std::cout << "main func " << i.i_ << std::endl;  
}  

那是为什么?

0 个答案:

没有答案