предупреждение: непостоянный размер массива в новом, невозможно проверить длину списка инициализаторов

Я столкнулся с проблемой, похожей на эту.

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

Кроме того, я хочу, чтобы конструктор вызывался для каждого экземпляра. Если я распечатаю значения массива, все

2

Решение

Проблема именно в том, что говорит вам компилятор.

Измерение известно только во время выполнения, поэтому вы можете использовать только функциональные возможности времени выполнения, такие как:

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)
};

и объекты будут перемещены или, в худшем случае, скопированы.

Дело в том, что векторные элементы не необходимость быть конструируемым по умолчанию.

(К сожалению, я не знаю, как сделать это без цикла или повторения кода.)

5

Другие решения

Из того, что я могу сказать, раздел 8.5 / 16 стандарта C ++ 11 в значительной степени исключает возможность вызова пользовательского конструктора для равномерной инициализации всех элементов массива типов классов. Вот соответствующий текст (я вырезал пару из перечисленных пунктов, которые не показались уместными):

Семантика инициализаторов следующая. Тип назначения
тип инициализируемого объекта или ссылки и источник
тип — это тип выражения инициализатора. Если инициализатор
не одно (возможно заключенное в скобки) выражение, тип источника
не определен.

— Если инициализатор (без скобок)
braced-init-list, объект или ссылка инициализируются списком (8.5.4).

— Если инициализатором является (), объект инициализируется значением.

— В противном случае, если тип назначения является массивом, программа некорректна.

2

По вопросам рекламы [email protected]