이 C ++ 0X 코드가 이동 생성자를 호출하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1046801

  •  20-08-2019
  •  | 
  •  

문제

어떤 이유로 든 다음 코드는 결코 전화하지 않습니다 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 할당 연산자를 사용하려고하므로 복사 할당 연산자로 돌아갑니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top