0Pricing
C++ Academy · Урок

consteval и constinit

Современные ключевые слова времени компиляции

«consteval и constinit» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

За пределами вычислений во время компиляции

В C++20 появились два ключевых слова, уточняющих программирование во время компиляции: consteval для функций с гарантированным вычислением во время компиляции и constinit для гарантированной инициализации во время компиляции.

Немедленные функции

Функция consteval обязана вычисляться во время компиляции. В отличие от constexpr, она никогда не может выполняться во время выполнения.

consteval int cube(int x) {
    return x * x * x;
}

int main() {
    constexpr int c = cube(3);   // OK: compile time
    return c;
}

Немедленные функции отклоняют вызовы во время выполнения

Вызов функции consteval со значением, известным только во время выполнения, является ошибкой компиляции — это требование обеспечивается компилятором.

consteval int cube(int x) { return x * x * x; }

int main() {
    int n = 4;
    // int bad = cube(n);   // ERROR: n is not a constant
    return cube(2);
}

Зачем нужны немедленные функции

Используйте их, когда вычисление не имеет смысла во время выполнения, например для создания таблицы констант или проверки литерала во время компиляции.

Вычисления во время компиляции и немедленные функции

Функции constexpr могут выполняться во время компиляции, а функции consteval делают это всегда. Выбирайте consteval, чтобы запретить случайное использование во время выполнения.

Гарантированная статическая инициализация

constinit гарантирует, что статическая переменная или переменная локального потока инициализируется во время компиляции, устраняя проблему порядка статической инициализации.

constinit int globalCount = 10;   // initialized at compile time

int main() {
    return globalCount;
}

constinit не означает const

В отличие от constexpr, переменную constinit всё ещё можно изменять после инициализации во время компиляции — это ключевое слово ограничивает только способ инициализации.

constinit int counter = 0;

int main() {
    counter = 5;   // OK: constinit allows mutation
    return counter;
}

Устранение проблемы порядка инициализации

Для нелокальных статических переменных в разных единицах трансляции constinit принудительно задаёт статическую инициализацию во время компиляции, поэтому значение готово до запуска любой динамической инициализации.

Сравнение трёх ключевых слов

constexpr: может вычисляться во время компиляции и является константным. consteval: должно вычисляться во время компиляции (для функций). constinit: принудительно задаёт инициализацию во время компиляции, но переменная остаётся изменяемой.

Поддержка компилятора

Это возможности C++20. Компилируйте с -std=c++20 (или более новой версией) в GCC или Clang либо с /std:c++20 в MSVC.

Выбор подходящего инструмента

Используйте consteval, чтобы принудительно выполнять вычисления во время компиляции, а constinit — чтобы сделать статическую инициализацию детерминированной. Вместе они делают программирование на C++ во время компиляции безопаснее.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли немедленные функции и гарантированную инициализацию.

Итоги

Вы изучили ключевые слова C++20 consteval (функции, которые должны выполняться во время компиляции) и constinit (гарантированная инициализация статических переменных во время компиляции с сохранением возможности изменения). Вместе с constexpr они дают точный контроль над вычислениями во время компиляции.

Часто задаваемые вопросы

Урок «consteval и constinit» бесплатный?

Да — полный текст урока «consteval и constinit» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «consteval и constinit»?

Современные ключевые слова времени компиляции Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «consteval и constinit»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Константные переменные и параметры
  2. Константные функции-члены
  3. constexpr и время компиляции
  4. consteval и constinit
← Назад к C++ Academy