2017-12-22 20 views
3
class TestClass 
{ 
    public: 
    TestClass(){ 
     cout<<"constructor"<<endl; 
     p = {1,2,3}; 
     cout<<(unsigned int *)(this->p.data())<<endl; 
    } 
    TestClass(const TestClass& test): p(std::move(test.p)) 
    { 
     cout <<"copy constructor"<<endl; 
     cout<<(unsigned int *)(this->p.data())<<endl; 

    } 
    TestClass(TestClass && test): p(std::move(test.p)) 
    { 
     cout <<"move constructor"<<endl; 
     cout<<(unsigned int *)(this->p.data())<<endl; 
    } 
    private: 
     std::vector<int> p; 
}; 


int main() 
{ 
    TestClass t{}; 
    TestClass p{t}; 
    TestClass s{std::move(p)}; 
    return 0; 
} 

그리고 출력이 생성자 아래의 주소는 아래와 다른 이유를 난 그냥 궁금왜이 벡터를 사용자 정의 클래스의 복사 생성자에서 이동할 수 없습니까?

constructor 
0xb92bf0 
copy constructor 
0xb915b0 
move constructor 
0xb915b0 

이다 생성자를 복사합니다. 내가 이해하는 것으로부터 복사 생성자조차도 사용되지만 std :: move를 사용하여 rvalue 참조를 얻고 벡터의 이동 생성자를 호출해야하므로 동일한 객체 여야합니다.

+4

이동하려면 원본 개체를 수정해야합니다. – StoryTeller

+6

복사 생성자는 이동하지 않는 복사를위한 것으로, 생성자는 이동 생성자입니다. 이런 의미를 바꿀 때 그 클래스의 복사 생성자가 어떻게 작동해야하는지에 대한 bork의 기대가있다. –

+2

'TestClass (const TestClass & test)''const '는'move'하지 말고'const'를 제거하면 기대 한 것을 볼 수 있지만 왜'ctor''가'move'입니까? – PYA

답변

4

std::move은 xvalue에 전달 된 모든 내용을 그냥 캐스트하므로 rvalue-references는 해당 값을 바인딩하여 리소스를 훔칠 수 있습니다. 여기 :

TestClass(const TestClass& test): p(std::move(test.p)) 

std::move 당신이 볼 수있는 등의 const 규정이 입력 const std::vector<int> &&의 표현을 생성합니다. 당신은 저작권법과를 확인하고 이동 - 생성자 std::vector의를 [vector]에 경우에, 당신은 이동 - 생성자 유형 std::vector<T> &&의 표현을 기대 것을 볼 수 있습니다, 그리고 복사 생성자는 const std::vector<T> & 기대 :

vector(const vector& x); 
vector(vector&&) noexcept; 

이 결과를 비교 이 두 생성자에 std::move(test.p)의 rvalue-reference는 const 한정자가있는 유형에 바인딩되지 않으므로 (rvalue-reference가 const -qualified 인 경우를 제외하고) move-constructor 과부하는 적합하지 않습니다. 다른 후보 (복사 생성자)는 const restrict로 입력을 받아 수행하며 xvalues은 우변과 같은 성질을 가지므로 :

http://en.cppreference.com/w/cpp/language/value_category#rvalue

r- 수치가에서는, CONST 좌변 기준을 초기화하는 데 사용될 수있다

이 경우 rvalue로 식별되는 객체의 수명은 참조 범위가 끝날 때까지 연장됩니다.

의 경우 복사 생성자가 적합하며 선택됩니다.