Требование, чтобы контейнеры std принимали только копируемые объекты, больше связано с интерфейсами контейнеров C ++ 03, чем с реализацией распределителя.
Например
vector<T> b(100);
vector<T> a;
a=b;
assert(a==b);
Стандарт заверяет нас, что a == b соответствует действительности. Тем не менее, если T не будет копируемым, то в лучшем случае a = b не будет компилироваться, в худшем случае a = b не определено. Кроме того,
a.push_back(T());
может привести к тому, что a выделит новое пространство, и под капотом будут скопированы копии, сделанные в новом базовом хранилище из старого.
Кроме того, в стандарте C ++ 03 нет ничего, что говорило бы, что реализация на самом деле должна вызывать allocator.construct, а на самом деле многие (например, gcc) этого не делают.
Стандарт C ++ 0x добавляет новые функции-члены в интерфейс контейнера для перемещаемых типов и разъясняет, как такие вещи, как operator =, ведут себя в их присутствии.
См. Www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2486.pdf
.