Move-Konstruktoren und Statische Arrays

Ich habe die Möglichkeiten der Bewegen Konstruktoren in C++, und ich Frage mich, was sind einige Möglichkeiten der Einnahme von Vorteil, diese Funktion an einem Beispiel, wie unten. Betrachten Sie diesen code:

template<unsigned int N>
class Foo {
public:
    Foo() {
        for (int i = 0; i < N; ++i) _nums[i] = 0;
    }

    Foo(const Foo<N>& other) {
        for (int i = 0; i < N; ++i) _nums[i] = other._nums[i];
    }

    Foo(Foo<N>&& other) {
        //??? How can we take advantage of move constructors here?
    }

    //... other methods and members

    virtual ~Foo() { /* no action required */ }

private:
    int _nums[N];
};

Foo<5> bar() {
    Foo<5> result;
    //Do stuff with 'result'
    return result;
}

int main() {
    Foo<5> foo(bar());
    //...
    return 0;
}

In diesem obigen Beispiel, wenn wir verfolgen das Programm (mit MSVC++ 2011), sehen wir, dass Foo<N>::Foo(Foo<N>&&) aufgerufen wird, wenn der Bau foo, die das gewünschte Verhalten. Allerdings, wenn wir nicht Foo<N>::Foo(Foo<N>&&), Foo<N>::Foo(const Foo<N>&) aufgerufen werden würde, statt, das würde eine redundante Kopie Betrieb.

Meine Frage ist nun, wie bereits im code, die mit diesem spezifischen Beispiel welches mit einem statisch zugewiesenen einfaches array, gibt es eine Möglichkeit zu nutzen die move-Konstruktor, um dies zu vermeiden, wird die redundante Kopie?

InformationsquelleAutor Zeenobit | 2011-10-25
Schreibe einen Kommentar