Проблема вообще не связана с массивами.
При инициализации по умолчанию объекта типа класса требуется конструктор по умолчанию. Если в вашем классе нет конструктора по умолчанию, у вас нет другого выбора, кроме как предоставить явный инициализатор при создании объектов этого класса. Это все.
Объявляя конструктор не по умолчанию в вашем классе Foo
, вы отключили неявную генерацию по умолчанию, поэтому теперь вам придется предоставлять инициализатор каждый раз, когда вы создаете объект Foo
, независимо от того, это элемент массива или нет.
Эта декларация
Foo f; // ERROR
не является массивом, но он не будет компилироваться по той же причине. Для его компиляции вам нужно будет указать явный инициализатор
Foo f(3); // OK
То же самое происходит с массивом, за исключением того, что в этом случае вы должны предоставить инициализатор для каждого элемента, используя синтаксис агрегатного инициализатора
Foo f[5] = { 1, 2, 3, 4, 5 };
Конечно, если вы окажетесь в контексте, где синтаксис агрегатного инициализатора не разрешен (в текущей версии стандарта C ++), например, в списке инициализатора конструктора или в новом выражении, то вы действительно испорчены. В таком контексте единственный выход - предоставить конструктор по умолчанию в типе элемента массива (если вы придерживаетесь встроенных массивов).