#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
質問:
- 最初のデストラクタが実行されるのはなぜですか (ただし、2 番目のオブジェクトに対しては実行されません)。
- 1 番目のオブジェクトの移動の前に 2 番目のオブジェクトの移動が実行されるのはなぜですか?
- 最後に各オブジェクトに対して 2 つのデストラクタが実行されるのはなぜですか?
PS確認したところ、オブジェクトは実際に期待どおりに配置されています(1番目はベクトルの位置0に移動し、2番目はベクトルの位置1に移動します)
PPS問題があれば、私はgcc 4.3を使用しており、次のようにプログラムをコンパイルします:
g++ n1.cpp -Wall -Wextra -pedantic -ansi -std=c++0x -O3