Конструкторы перемещения и статические массивы

Я изучал возможности Конструкторов перемещения в C ++, и мне было интересно, как можно использовать преимущества этой функции в примере, приведенном ниже. . Рассмотрим этот код:

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

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

    Foo(Foo&& 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;
}

В этом примере выше, если мы отслеживаем программу (с MSVC ++ 2011), мы видим, что Foo :: Foo (Foo &&) вызывается при построении foo , что является желаемым поведением. Однако, если бы у нас не было Foo :: Foo (Foo &&) , Foo :: Foo (const Foo &) вместо этого будет вызвана операция избыточного копирования.

У меня вопрос, как указано в коде, в этом конкретном примере, который использует статически распределенный простой массив, есть ли способ использовать конструктор перемещения, чтобы избежать этой избыточной копии?

26
задан iammilind 25 October 2011 в 06:39
поделиться