Почему перераспределяется векторная копия вместо перемещения элементов? [Дубликат]

Possible Duplicate:
How to enforce move semantics when a vector grows?

insert, push_back а такжеemplace(_back) может вызвать перераспределениеstd::vector, Я был сбит с толку, увидев, что следующий кодcopies элементы вместоmoving их при перераспределении контейнера.

<code>#include <iostream>
#include <vector>

struct foo {
    int value;

    explicit foo(int value) : value(value) {
        std::cout << "foo(" << value << ")\n";
    }

    foo(foo const& other) noexcept : value(other.value) {
        std::cout << "foo(foo(" << value << "))\n";
    }

    foo(foo&& other) noexcept : value(std::move(other.value)) {
        other.value = -1;
        std::cout << "foo(move(foo(" << value << "))\n";
    }

    ~foo() {
        if (value != -1)
            std::cout << "~foo(" << value << ")\n";
    }
};

int main() {
    std::vector<foo> foos;
    foos.emplace_back(1);
    foos.emplace_back(2);
}
</code>

На моей конкретной машине, использующей мой определенный компилятор (GCC 4.7), это печатает следующее:

<code>foo(1)
foo(2)
foo(foo(1))
~foo(1)
~foo(1)
~foo(2)
</code>

Однако при удалении конструктора копирования (foo(foo const&) = delete;), генерируется следующий (ожидаемый) результат:

<code>foo(1)
foo(2)
foo(move(foo(1))
~foo(1)
~foo(2)
</code>

Это почему? Будет ли перемещение в целом более эффективным или, по крайней мере, не намного менее эффективным, чем копирование?

Следует отметить, чтоGCC 4.5.1 делает ожидаемую вещь & # x2013; & # xA0; это регрессия в GCC 4.7 или это хитроумная оптимизация, потому что компилятор видит, что мой объект копируется дешево (но как ?!)?

Также обратите внимание, что я убедился, что этоis вызвано перераспределением, путем экспериментальногоfoos.reserve(2); перед вставками; это не вызывает ни копирования, ни перемещения.

Ответы на вопрос(3)

Ваш ответ на вопрос