Я столкнулся с проблемой, похожей на эту.
int j = 6;
int *k = new int[j]{4};
Предупреждение:
warning: non-constant array size in new, unable to verify length
of initializer-list [enabled by default]
Я сталкиваюсь только с предупреждением, без ошибок, и я запускаю с -std = gnu ++ 11
Кроме того, я хочу, чтобы конструктор вызывался для каждого экземпляра. Если я распечатаю значения массива, все
Проблема именно в том, что говорит вам компилятор.
Измерение известно только во время выполнения, поэтому вы можете использовать только функциональные возможности времени выполнения, такие как:
std::vector<int> v(j, 4);
// `v` contains `j` ints, all initialised to `4`
Если у вас есть тип элемента, который не может быть создан по умолчанию, вы можете создать элементы на месте:
std::vector<T> v;
v.reserve(j);
for (size_t i = 0; i < j; i++)
v.emplace_back(ctor-args-here);
Вы также можете использовать список инициализаторов:
std::vector<T> v{
T(ctor-args-here), T(ctor-args-here), T(ctor-args-here),
T(ctor-args-here), T(ctor-args-here), T(ctor-args-here)
};
и объекты будут перемещены или, в худшем случае, скопированы.
Дело в том, что векторные элементы не необходимость быть конструируемым по умолчанию.
(К сожалению, я не знаю, как сделать это без цикла или повторения кода.)
Из того, что я могу сказать, раздел 8.5 / 16 стандарта C ++ 11 в значительной степени исключает возможность вызова пользовательского конструктора для равномерной инициализации всех элементов массива типов классов. Вот соответствующий текст (я вырезал пару из перечисленных пунктов, которые не показались уместными):
Семантика инициализаторов следующая. Тип назначения
тип инициализируемого объекта или ссылки и источник
тип — это тип выражения инициализатора. Если инициализатор
не одно (возможно заключенное в скобки) выражение, тип источника
не определен.— Если инициализатор (без скобок)
braced-init-list, объект или ссылка инициализируются списком (8.5.4).— Если инициализатором является (), объект инициализируется значением.
— В противном случае, если тип назначения является массивом, программа некорректна.