以下の特定のクラスX
(明示的に定義されたもの以外の特別なメンバー関数は、この実験には関係ありません):
struct X
{
X() { }
X(int) { }
X(X const&) { std::cout << "X(X const&)" << std::endl; }
X(X&&) { std::cout << "X(X&&)" << std::endl; }
};
次のプログラムは、型のオブジェクトのベクトルを作成X
し、容量を超えて再割り当てが強制されるようにサイズを変更します。
#include <iostream>
#include <vector>
int main()
{
std::vector<X> v(5);
v.resize(v.capacity() + 1);
}
クラスは移動コンストラクターを提供するため、再割り当て後にベクターの以前のコンテンツが新しいストレージに移動X
されることを期待します。驚くべきことに、そうではないようで、得られる出力は次のとおりです。
X(X const&)
X(X const&)
X(X const&)
X(X const&)
X(X const&)
なんで?