Перемещение временных объектов в вектор

#include <iostream>
#include <utility>
#include <vector>

int i = 0;
struct A
{
    A() : j( ++i )
    {
        std::cout<<"constructor "<<j<<std::endl;
    }
    A( const A & c) : j(c.j)
    {
        std::cout<<"copy "<<j<<std::endl;
    }
    A( const A && c) : j(c.j)
    {
        std::cout<<"move "<<j<<std::endl;
    }
    ~A()
    {
        std::cout<<"destructor "<<j<<std::endl;
    }

    int j;
};

typedef std::vector< A > vec;

void foo( vec & v )
{
    v.push_back( std::move( A() ) );
}

int main()
{
    vec v;

    foo( v );
    foo( v );
}

Пример выше дает следующий результат:

constructor 1
move 1
destructor 1
constructor 2
move 2
move 1
destructor 1
destructor 2
destructor 1
destructor 2

Вопросы:

  1. Почему выполняется 1-й деструктор (но он не выполняется для 2-го объекта)?
  2. Почему перемещение 2-го объекта выполняется до перемещения 1-го объекта?
  3. Почему в конце выполняются два деструктора для каждого объекта?

PS Я только что проверил, и объекты действительно размещены так, как ожидалось (1-й идет в позицию 0 в векторе, а 2-й - в позицию 1 в векторе)

PPS Если это важно, я используя gcc 4.3, и я компилирую программу следующим образом:

g++ n1.cpp -Wall -Wextra -pedantic -ansi -std=c++0x -O3
9
задан Bo Persson 6 October 2011 в 22:10
поделиться