私はリソース管理オブジェクトをベクトルに追加するときに、なぜ追加の移動コンストラクタ操作を取得するのか理解しようとしています。ここでオブジェクトをベクターに移動するときに、余分な移動コンストラクタ操作が必要なのはなぜですか?
は、私のリソース管理クラスである:
class Resource
{
public:
Resource() {
own_ = true;
id_ = next_id++;
std::cout << "Resource " << id_ << " constructed\n";
}
Resource(Resource&& c) {
std::cout << "Move constructed from " << c.id_ << " to " << id_ << "\n";
swap(*this, c);
}
~Resource() {
if (own_) {
std::cout << "Resource " << id_ << " destructed\n";
}
}
Resource& operator=(Resource&& c) {
std::cout << "Move assigned from " << c.id_ << " to " << id_ << "\n";
swap(*this, c);
return *this;
}
void swap(Resource& a, Resource& b) {
std::swap(a.id_, b.id_);
std::swap(a.own_, b.own_);
}
Resource(Resource const&) = delete;
auto operator=(Resource const&)->Resource = delete;
static int next_id;
private:
bool own_ = false;
int id_;
};
int Resource::next_id = 1;
そして、ここでは、私は2つのオブジェクトを作成し、リソースの私のベクトルにそれらを移動しています主な機能です:
int main() {
std::vector<Resource> resources;
Resource a, b;
resources.push_back(std::move(a));
resources.push_back(std::move(b));
return 0;
}
そしてここにはあります出力。最初の4行は私が期待したようなものですが、最後の行は何かがベクトル内で並べ替えまたはソートされているような余分な操作のようです。
Resource 1 constructed
Resource 2 constructed
Move constructed from 1 to -842150451
Move constructed from 2 to -842150451
Move constructed from 1 to -842150451
http://stackoverflow.com/questions/23717151/why-emplace-back-is-faster-than-push-back –
コピーコンストラクタが 'delete'dでない場合は、 2つの動きの構造を見たが、[非常に異なる理由](http://stackoverflow.com/q/8001823/241631)。 – Praetorian
私の最後のコメントは、あなたのコピーコンストラクタが(デフォルトでは)暗黙のうちに削除されているからだと言っているはずです。 – Praetorian