Ошибка возврата массива из функции consteval

Я пытаюсь создать константную функцию, которая принимает размер 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]" не дал результата создать допустимое постоянное выражение.

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

Вы возвращаете висячий указатель.

HolyBlackCat 27.06.2024 11:08

Понятно, как мне сделать так, чтобы указатель оставался?

icy icy 27.06.2024 11:10

Несвязано: ваш цикл for оставляет последний элемент нетронутым (возможно, так и было задумано).

Fareanor 27.06.2024 11:14

Вы можете вернуть std::array по значению. Или вы можете принять указатель на массив в качестве параметра и заполнить существующий массив степенями двойки.

HolyBlackCat 27.06.2024 11:18

Хорошо, как мне пометить комментарий как решение?

icy icy 27.06.2024 11:19

как заголовок связан с вопросом или сообщением об ошибке? «недопустимое использование памяти интерпретатора» нигде не упоминается

463035818_is_not_an_ai 27.06.2024 11:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете вернуть необработанный массив из функции 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;
}

Другие вопросы по теме

Каков ожидаемый результат при объявлении локальной автоматической функции?
Как суммировать std::range?
Как распечатать неструктурные результаты функций constexpr во время компиляции с помощью clang++?
Почему take(n), используемый в istream_view, приводит к пропуску следующего токена в C++20?
Почему объявление функции глобальной области со встроенным типом arg должно быть видимым перед неквалифицированным вызовом этого имени с аргументом типа шаблона?
Есть ли способ отсортировать одну переменную-член в коллекции структур с помощью стандартной библиотеки C++?
Не могу создать std::ranges::subrange с помощью моего итератора
Трехстороннее сравнение по умолчанию генерирует больше кода, чем ожидалось
C++20 и новее – как лучше всего реализовать «перечисление с большей функциональностью»?
Неожиданный результат с `std::views::transform`, вероятно, вызван "безымянным временным"