4

何らかの理由で、次のコードは決して呼び出しません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;
};
4

2 に答える 2

11

移動コンストラクターを使用していません。スワップは次のように実装されていると思います

Event a;
Event b;

Event temp(move(a)); // this one wants to use a move constructor
a = move(b);
b = move(temp);

コードに存在しない移動代入演算子を使用したいので、コピー代入演算子にフォールバックします。

于 2009-06-26T00:38:00.090 に答える
10

コードには、move コンストラクターが呼び出されると予想される場所が 2 つあります (ただし、そうではありません)。

1) std::move の呼び出し
2) 代入中。

1) に関して、std::move は単純なキャストを行います - コピーからオブジェクトを作成しません - その場合、move コンストラクターが呼び出される可能性がありますが、単純な右辺値キャストを行うため、呼び出されません。 . std::move の定義は に似ていstatic_cast<Event&&>(temp)ます。

2) に関しては、初期化と代入は 2 つのまったく異なる操作です (一部の形式の初期化では「=」記号が使用されますが)。コードは代入を行うため、const lvalue 参照を受け入れるように宣言されているデフォルトの代入演算子を使用します。あるイベント オブジェクトを別のイベント オブジェクトで初期化することはないため、move コンストラクターが呼び出されることはありません。移動代入演算子を宣言した場合: Event& operator=(Event&& other)、現在のコードがそれを呼び出すか、記述した場合:Event a; Event tmp = move(a);記述されている移動コンストラクターが呼び出されます。

于 2009-06-26T00:37:24.803 に答える