std::vector に入れる独自クラスにはデフォルトコンストラクタが必要

std::vector に独自クラスを入れる場合、デフォルトコンストラクタとコピーコンストラクタが必要不可欠だ。

#include <iostream>
#include <vector>

class Foo {
public:
    int i;
    Foo() : i(0) {
        std::cout << "default" << std::endl;
    }
    Foo(int num) : i(num) {
        std::cout << "int param" << std::endl;
    }
    Foo(const Foo &rhs) : i(rhs.i) {
        std::cout << "copy const" << std::endl;
    }
    ~Foo() {
        std::cout << "destructer" << std::endl;
    }
};

int main(int argc, char *argv[]) {
    std::vector<Foo> v;
    v.push_back(Foo(1));
    v.resize(2);
    return 0;
}

上記のコードの出力はこんな感じ。

int param
copy const
destructer
default
copy const
copy const
copy const
copy const
destructer
destructer
destructer
destructer
destructer
destructer

resize した際に、コピーコンストラクタが想定以上に呼び出されるのは何なんだろう。vector 内でコピーが繰り返されて、メモリ位置が調整されてるのかな。

ちなみに、デフォルトコンストラクタを用意しなければならないという制約のせいで、メンバ変数を const にすることができないので、設計に支障がでてしまう。こういう場合、どういう風に設計したらいいんだろう。