Нет общего требования, чтобы тип был конструируемым по умолчанию - он должен быть копируемым и назначаемым. Ваш код не работает, потому что вы пытаетесь создать список из 10 элементов - они должны быть каким-то образом созданы, и поэтому должен использоваться конструктор по умолчанию - но только в этом конкретном случае. Если бы вы создали пустой список и добавили его, такого требования не было бы.
То же самое верно и для других контейнеров - попробуйте скомпилировать следующее:
#include <vector>
struct A {
A( int x ) : z(x) {}
int z;
};
std::vector <A> a(10);
Что касается второй части вашего вопроса, я бы просто заметил, что согласованность интерфейса не была основным критерием проектирования для стандартных контейнеров - например, нет намерения, чтобы один тип контейнера был замена на другую. Это хорошо обсуждается в пунктах 1 и 2 книги Скотта Мейерса «Эффективный STL».