Вызов функции consteval внутри if consteval вызывает ошибку в контексте, отличном от constexprC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Вызов функции consteval внутри if consteval вызывает ошибку в контексте, отличном от constexpr

Сообщение Anonymous »

Следующий код не компилируется с g++ 14.1 или clang++ 18.1:

Код: Выделить всё

#include 

consteval int
plusone(int n)
{
return n+1;
}

constexpr int
maybeplusone(int n)
{
if (std::is_constant_evaluated()) {
n = plusone(n);
}
return n;
}

int
not_consteval()
{
return maybeplusone(1);
}
Компилятор сообщает, что n не является постоянным выражением. Если я изменю if (std::is_constant_evaluated()) на if consteval, то код компилируется с clang++, но не с g++. Мои вопросы:

[*]Почему код недействителен?

[*]Должен ли if consteval отличаться от if (std::is_constant_evaluted()), и если да, то правильно ли clang++ принимать код с if consteval?

[*]Есть ли лучший способ определить функцию типа plusone, которая не должна случайно вызываться во время выполнения, но не вызывая таких ошибок? Что-то вроде static_assert(std::is_runtime_evaluated()) — за исключением того, что это, по-видимому, бесполезно, поскольку статическое утверждение всегда будет оцениваться во время компиляции.

< /ol>
Как бы то ни было, в моем более сложном приложении у меня есть разные распределители памяти для времени компиляции и времени выполнения, поэтому я хочу сделать что-то вроде этого

Код: Выделить всё

if consteval {
p = my_consteval_allocator(n);
}
else {
p = my_real_allocator(n);
}
с аналогичной логикой освобождения. К сожалению, компилятор пытается вызвать my_consteval_allocator в контекстах, отличных от constexpr, когда ему известен требуемый размер выделения.

Подробнее здесь: https://stackoverflow.com/questions/787 ... onstexpr-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»