Я пытаюсь создать константную функцию, которая принимает размер int в качестве параметра шаблона и возвращает массив этого размера с каждым индексом, заполненным соответствующей степенью 2.
template <int sz>
consteval int* conflagtab() {
int ar[sz] = {};
for (unsigned int i = 0; i < sz - 1; i++) {
ar[i] = conflag(i);
}
return ar;
}
Однако, когда я пытаюсь его использовать, я получаю ошибку:
вызов функции consteval "conflagtab<sz>() [с sz=31]" не дал результата создать допустимое постоянное выражение.
Я попытался поместить его в глобальное пространство имен, чтобы посмотреть, есть ли изменения, но это не имело никакого значения. Я ожидаю, что он просто вернет указатель на массив.
Понятно, как мне сделать так, чтобы указатель оставался?
Несвязано: ваш цикл for
оставляет последний элемент нетронутым (возможно, так и было задумано).
Вы можете вернуть std::array
по значению. Или вы можете принять указатель на массив в качестве параметра и заполнить существующий массив степенями двойки.
Хорошо, как мне пометить комментарий как решение?
как заголовок связан с вопросом или сообщением об ошибке? «недопустимое использование памяти интерпретатора» нигде не упоминается
Вы не можете вернуть необработанный массив из функции consteval
, особенно по указателю. Ваш пример, если бы не consteval
, был бы висящим указателем. Завершение постоянной оценки и сохранение созданного значения new[]
не допускается, вам придется delete[]
где-то позже.
Вы можете вернуть std::array
:
template <int sz>
consteval std::array<int, sz> conflagtab() {
std::array<int, sz> ar;
for (unsigned int i = 0; i < sz - 1; i++) {
ar[i] = conflag(i);
}
return ar;
}
Вы возвращаете висячий указатель.