2010-12-15 3 views
1

저는 생성자를 이동하는 것이 새롭고 VS2010 비헤이비어와 매우 혼동합니다. 나는이 목록의에 갖다 두도록를 사용하여 클래스 A의 인스턴스를 넣었을 때생성자, 비 const 복사 생성자, 목록의 생성자를 VS2010으로 이동하십시오.

A(A&& input) {some code} 

가 :

mylist.emplace(a); 

내 이동 생성자는 나는 내 지식에있는이 같다 (클래스 A의) 이동 생성자를 설계 하지라고, 그리고 const가 아닌 복사 생성자 대신 호출됩니다

A(A& input) {the same code as move constructor} 

을 다른 한편으로 나는이 수행 할 때

mylist.emplace(A(2)); 

내 이동 생성자가 예상대로 호출됩니다. 그래서, 내 질문은 :

  1. 목록의 emplace 내 이동 생성자 대신 내 const 복사 생성자를 호출하는 이유는 무엇입니까?
  2. 비 const 복사 생성자가 실제로 이동 생성자를 정의하는 다른 방법입니까?
  3. 이 동작은 정확합니까 (C++ 0x 컴파일러의 경우) 또는 VS2010의 동작입니까?

미리 감사드립니다.

+0

복사 생성자가 이동 생성자와 동일한 동작을하는 경우 클래스가 심각하게 손상되지 않았습니까? – UncleBens

+0

@UncleBens : 둘 다 복사를 할 수 있습니다. – ybungalobill

+0

@ybungalobill : 그런 경우 왜 move 생성자를 정의하지 않을까요? 그리고 복사 생성자가 복사본을 만드는 경우 왜 비 const 참조를 사용해야합니까? – UncleBens

답변

2
mylist.emplace(a); 

여기서 a은 l- 값이므로 이동하지 않고 복사합니다. 명시 적으로해야합니다.

mylist.emplace(std::move(a)); 

예. 올바른 동작입니다.