이 C ++ 0X 코드가 이동 생성자를 호출하지 않는 이유는 무엇입니까?
문제
어떤 이유로 든 다음 코드는 결코 전화하지 않습니다 Event::Event(Event&& e)
Event a;
Event b;
Event temp;
temp = move(a);
a = move(b);
b = move(temp);
왜 안 돼?
사용 std::swap
한 번 호출합니다.
class Event {
public:
Event(): myTime(0.0), myNode(NULL) {}
Event(fpreal t, Node* n);
Event(Event&& other);
Event(Event const& other) = delete;
~Event();
bool operator<(Event const& other) const { return myTime < other.myTime; }
bool operator>(Event const& other) const { return myTime > other.myTime; }
fpreal getTime() const { return myTime; }
void setTime(fpreal time) { myTime = time; }
Node* getNode() const { return myNode; }
private:
fpreal myTime;
Node* myNode;
};
해결책
코드에는 이동 생성자가 호출 될 것으로 예상 할 수있는 두 개의 잠재적 위치가 있습니다.
1) STD :: 이동
2) 과제 중.
1), std :: move는 간단한 캐스트를 수행합니다. 사본에서 객체를 생성하지 않습니다. 그렇다면 Move 생성자가 호출 될 수 있지만 간단한 rvalue 캐스트를 수행하기 때문에 호출되지 않습니다. . STD :: 이동의 정의는 유사합니다 static_cast<Event&&>(temp)
.
2)과 관련하여, 초기화와 할당은 완전히 다른 두 가지 작업입니다 (일부 초기화 형태의 초기화가 '='기호를 사용하더라도). 코드는 할당을 수행하므로 Const LValue 참조를 수락하도록 선언 된 기본 할당 연산자를 사용합니다. 하나의 이벤트 객체와 다른 이벤트 객체를 초기화하지 않으므로 이동 생성자가 호출되는 것을 볼 수 없습니다. 이동 할당 연산자를 선언 한 경우 : Event& operator=(Event&& other)
, 그러면 현재 코드가 호출되거나 다음을 작성하면 다음과 같습니다. Event a; Event tmp = move(a);
당신의 이동 생성자는 서면대로 호출됩니다.
다른 팁
이동 생성자를 사용하지 않습니다. 스왑이 이와 같은 구현되었다고 생각합니다
Event a;
Event b;
Event temp(move(a)); // this one wants to use a move constructor
a = move(b);
b = move(temp);
코드에 존재하지 않는 Move 할당 연산자를 사용하려고하므로 복사 할당 연산자로 돌아갑니다.