Все 3 варианта удовлетворяют 1, поскольку default + copy, default + move эквивалентны значению по умолчанию. Все 3 варианта удовлетворяют 3. Все 3 варианта удовлетворяют 2: они работают для типов DefaultConstructible. Определенный алгоритм может использоваться для Подвижных типов. В STL принято использовать разные версии алгоритмов для типов с разными возможностями.

у приложение для Linux и Windows, и заметил, что сборка GCC производит много бесполезных вызовов конструктора копирования.

Вот пример кода, чтобы произвести это поведение:

struct A
{
    A()                { std::cout << "default" << std::endl; }
    A(A&& rvalue)      { std::cout << "move"    << std::endl; }
    A(const A& lvalue) { std::cout << "copy"    << std::endl; }
    A& operator =(A a) { std::cout << "assign"  << std::endl; return *this; }
};

BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
    std::vector<A> vec_a( 3 );
}

Этот тест просто создает вектор из 3 элементов. Я ожидаю 3 вызова конструктора по умолчанию и 0 копий, так как нетA lvalues.

В Visual C ++ 2010 выводом является:

default
move
default
move
default
move

В GCC 4.4.0 (MinGW) (-O2 -std = c ++ 0x) выходные данные:

default
copy
copy
copy

Что происходит и как мне это исправить? Копии стоят дорого для реального класса, конструкция по умолчанию и ходы дешевы.

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

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