2017-11-27 14 views
0

라고하지, 내 환경에서 이동 생성자가 호출되지 않습니다 :C++ 이동 생성자는 다음 (빌려)의 예에서

#include <iostream> 

class MyClass { 
    public: 
     MyClass() 
     { 
      std::cout << "default constructor\n"; 
     } 
     MyClass(MyClass& a) 
     { 
      std::cout << "copy constructor\n"; 
     } 

     MyClass(MyClass&& b) 
     { 
      std::cout << "move constructor\n"; 
     } 
}; 

void test(MyClass&& temp) 
{ 
    MyClass a(MyClass{}); // calls MOVE constructor as expected 
    MyClass b(temp); // calls COPY constructor... 
} 

int main() 
{ 
    test(MyClass{}); 
    return 0; 
} 

내 출력은 다음과 같습니다 기본 생성자 기본 생성자 복사 생성자

Xcode 버전 9.1, 이동 생성자 rvalue 참조를 호출해야 shouldnt? 내가 여기서 무엇을 놓치고 있니?

존.

+0

'MyClass && temp'는 실제로 MyClass b (temp);를 호출 한 시점의 좌변 값입니다 (이름이 있기 때문에); rvalue 생성자를 호출하려면 * move * this ('MyClass b (std :: move (temp));') –

답변

0

무엇이 여기에 있습니까?

요점은 이름이있는 모든 것이 lvalue입니다. 물론이다 좌변

void test(MyClass&& temp) 

:

그것은라는 r- 수치 기준 자체에서 좌변과 temp 것을 의미한다. 따라서 이동 생성자는 호출되지 않습니다. 당신이 이동 생성자를 호출 할 경우

, std::move 사용 : 그런데

void test(MyClass&& temp) 
{ 
    // ... 
    MyClass b(std::move(temp)); // use std::move here 
} 

MyClass(MyClass& a) 
{ 
    std::cout << "copy constructor\n"; 
} 

는 복사 생성자 아닌 복사 생성자의 형태가 있기 때문에 :

MyClass(const MyClass& a) { ... } 
+0

이 코드는 다음과 같아야합니다. MyClass a (MyClass {}); 이동 생성자를 호출해야합니까? –

+0

@ JohnGorter일지도 모르지만 실제로는 elion 복사가 수행됩니다. http://en.cppreference.com/w/cpp/language/copy_elision –