Почему параметры шаблона не считаются постоянными выражениями (для consteval)? [дубликат]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему параметры шаблона не считаются постоянными выражениями (для consteval)? [дубликат]

Сообщение Anonymous »

Я хотел бы использовать функции consteval для выполнения вычислений над параметрами шаблона во время компиляции, чтобы мои операции приводили к немедленным результатам, не приводящим к снижению производительности. Например:

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

// Changing this to constexpr will cause the function
// to be invoked at runtime.
consteval int abs(int x) {
return x < 0 ? -x : x;
}

template 
struct Test {
bool isValid(int y) {
return y < abs(N); // Error.
}
};
Я использовал consteval, чтобы abs(N) заменялось немедленным значением, а не вызовом функции во время выполнения (как это произошло бы, если бы abs() были constexpr). Например, я думаю, что в теле Test::isValid() abs(7) разрешается до 7 и его не нужно вычислять во время выполнения. Однако этот код выдает следующую ошибку:

Вызов константной функции «abs» не является постоянным выражением... подвыражение недопустимо в постоянном выражении [ valid_consteval_call]

(проверено в clang 17.0.6). Эта ошибка по-прежнему возникает, если вы пытаетесь определить статическую переменную constexpr на основе N:

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

// Changing this to constexpr works though!
consteval int abs(int x) {
return x < 0 ? -x : x;
}

template 
struct Test {
static constexpr int ABS_N = abs(N); // Error

bool isValid(int y) {
return y < ABS_N;
}
};
Самое смешное: если вы измените abs() с consteval на constexpr в этой версии, то сгенерированный код использует немедленное действие, как я и хотел! С другой стороны, шаблоны можно использовать с consteval для достижения той же цели:

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

template 
consteval int abs() {
return X < 0 ? -X : X;
}

template 
struct Test {
bool isValid(int y) {
return y < abs();
}
}
Я также заметил, что использование статической переменной constexpr вместо параметра шаблона работает, хотя здесь довольно легко понять, почему:

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

struct Test {
static constexpr int N = 7;

bool isValid(int y) {
return y < abs(N);
}
}
Почему параметры шаблона нельзя передавать в константные функции?


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

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

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

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

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

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

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