C++ C++  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

constexpr и вычисления времени компиляции

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

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов, время — 85 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 30
Обязана ли constexpr-функция всегда выполняться во время компиляции?
C++C++20
constexpr int square(int x) { return x * x; }
int runtime_value();
int a = square(runtime_value());
constexpr int b = square(4);
Вопрос 2 из 30
Пользователь вводит число 5. Что напечатает программа?
C++C++20
#include <iostream>
constexpr int double_value(int x){ return x*2; }
int main(){ int x; std::cin >> x; std::cout << double_value(x); }
Вопрос 3 из 30
Почему `constexpr int x = runtime();` не компилируется?
C++C++20
int runtime();
constexpr int x = runtime();
Вопрос 4 из 30
Можно ли использовать локальные переменные и циклы в constexpr-функции современного C++?
C++C++20
constexpr int sum_to(int n) {
    int sum = 0;
    for (int i = 1; i <= n; ++i)
        sum += i;
    return sum;
}
static_assert(sum_to(10) == 55);
Вопрос 5 из 30
Что происходит с памятью, выделенной `new` во время constant evaluation C++20?
C++C++20
constexpr int make_value() {
    int* p = new int(7);
    int result = *p;
    delete p;
    return result;
}

static_assert(make_value() == 7);
Вопрос 6 из 30
Чем consteval-функция отличается от constexpr?
C++C++20
constexpr int checked_square(int x) { return x * x; }
consteval int compile_time_id(int x) { return x * 31 + 7; }

int a = checked_square(read_value());
constexpr int b = compile_time_id(5);
Вопрос 7 из 30
Что произойдёт с вызовом `square(n)`, если square consteval, а n прочитан из ввода?
C++C++20
consteval int square(int x){ return x*x; }
int n; std::cin >> n;
int y = square(n);
Вопрос 8 из 30
Для чего нужен `if consteval`?
C++C++23
constexpr int checked_abs(int x) {
    if consteval {
        if (x == std::numeric_limits<int>::min())
            throw "overflow";
    }
    return x < 0 ? -x : x;
}
Вопрос 9 из 30
Можно ли взять указатель на consteval-функцию и сохранить для обычного runtime-вызова?
C++C++20
consteval int token(int n) { return n + 100; }
// попытка использовать адрес как обычный runtime callback
auto* callback = &token;
Вопрос 10 из 30
Какой сценарий хорошо подходит consteval?
C++C++20
consteval std::uint32_t field_id(std::string_view name) {
    return checked_hash(name); // ошибка компиляции при недопустимом имени
}
constexpr auto id = field_id("user.name");
Вопрос 11 из 30
Что делает `if constexpr` с невыбранной ветвью в шаблоне?
C++C++20
template<class T>
std::string describe(const T& value) {
    if constexpr (std::integral<T>) {
        return std::to_string(value);
    } else {
        return value.to_string();
    }
}
Вопрос 12 из 30
Что представляет `std::integral_constant<int, 5>`?
C++C++20
using Five = std::integral_constant<int, 5>;

static_assert(Five::value == 5);
static_assert(std::is_same_v<Five::value_type, int>);
int data[Five{}];
Вопрос 13 из 30
Как вычислить сумму parameter pack `args` fold-expression?
C++C++20
template<class... Args>
auto sum(Args... args) {
    return (args + ... + 0);
}

static_assert(sum(1, 2, 3) == 6);
Вопрос 14 из 30
Почему `std::array<T, N>` имеет N в типе, а std::vector<T> — нет?
C++C++20
std::array<int, 4> fixed{};
std::array<int, 8> larger{};
static_assert(!std::is_same_v<decltype(fixed), decltype(larger)>);

std::vector<int> a(4), b(8);
static_assert(std::is_same_v<decltype(a), decltype(b)>);
Вопрос 15 из 30
Когда шаблонная метафункция по типам всё ещё уместнее constexpr-функции?
C++C++20
template<class T>
struct add_pointer_if_scalar {
    using type = std::conditional_t<std::is_scalar_v<T>, T*, T>;
};
using Result = add_pointer_if_scalar<int>::type;
Вопрос 16 из 30
Почему глубокая шаблонная рекурсия может завершиться ошибкой?
C++C++20
template<int N>
struct Depth : Depth<N - 1> {};
template<>
struct Depth<0> {};
Depth<100000> object;
Вопрос 17 из 30
Может ли корректное constexpr-вычисление превысить лимит компилятора?
C++C++20
constexpr std::uint64_t search() {
    for (std::uint64_t i = 0; i < 1'000'000'000ULL; ++i)
        if (matches(i)) return i;
    return 0;
}
constexpr auto value = search();
Вопрос 18 из 30
Почему большая constexpr-таблица в заголовке может замедлить сборку многих файлов?
Вопрос 19 из 30
Что делает диагностику template/constexpr ошибки особенно тяжёлой?
Вопрос 20 из 30
Почему зависимость constexpr-результата от `__TIME__` ухудшает воспроизводимость?
C++C++20
consteval std::uint32_t build_stamp() {
    return parse_hhmmss(__TIME__);
}

inline constexpr auto stamp = build_stamp();
// Два запуска компилятора в разное время дают разные объекты.
Вопрос 21 из 30
Как проверить функцию в режиме constant evaluation?
Вопрос 22 из 30
Зачем отдельно тестировать runtime-вызов constexpr-функции?
Вопрос 23 из 30
Как протестировать, что consteval API отвергает runtime-аргумент?
Вопрос 24 из 30
Какой тест выявит переполнение в compile-time арифметике?
Вопрос 25 из 30
Почему полезно сравнить constexpr-алгоритм с простым runtime-эталоном на наборе данных?
Вопрос 26 из 30
Всегда ли перенос вычисления в compile time ускоряет программу в целом?
Вопрос 27 из 30
Когда предварительно сгенерированный файл данных может быть лучше constexpr-метапрограммы?
Вопрос 28 из 30
Почему шаблон на значении N может раздуть бинарник?
Вопрос 29 из 30
Какой API яснее сообщает требование compile-time строки формата?
Вопрос 30 из 30
Когда обычная runtime-валидация предпочтительнее consteval?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу