C++ C++  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Concepts и ограничения шаблонов

Тест проверяет, умеет ли разработчик превратить неявные ожидания шаблона в явный контракт. Задания сравнивают requires-выражения, именованные концепты и старые приёмы SFINAE, а также показывают, как слишком широкое или слишком узкое ограничение портит интерфейс.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 25 вопросов, время — 70 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 25
Что проверяет это requires-выражение?
C++C++20
template<class T>
concept Sized = requires(T a) {
    a.size();
};
Вопрос 2 из 25
Как потребовать, чтобы `a.size()` возвращал тип, преобразуемый в std::size_t?
C++C++20
template<class T>
concept HasSize = requires(const T& a) {
    { a.size() } -> std::convertible_to<std::size_t>;
};

static_assert(HasSize<std::vector<int>>);
Вопрос 3 из 25
Что проверяет строка `typename T::value_type;` внутри requires?
C++C++20
template<class T>
concept HasValueType = requires {
    typename T::value_type;
};

static_assert(HasValueType<std::vector<int>>);
Вопрос 4 из 25
Чем `requires requires(T x) { x + x; }` отличается по роли двух requires?
C++C++20
template<class T>
requires requires(T x) { x + x; }
auto twice(T value) {
    return value + value;
}
Вопрос 5 из 25
Как проверить булево условие, зависящее от типа, внутри requires?
C++C++20
template<class T>
concept SmallObject = requires {
    requires (sizeof(T) <= 64);
};

static_assert(SmallObject<int>);
Вопрос 6 из 25
Что означает параметр `std::integral auto x`?
C++C++20
void add_to_total(std::integral auto value) {
    total += static_cast<std::int64_t>(value);
}

add_to_total(42);
// add_to_total(3.14);
Вопрос 7 из 25
Как объединить требования “Range” и “Sortable”?
C++C++20
template<class R>
concept SortableRange =
    std::ranges::random_access_range<R> &&
    std::sortable<std::ranges::iterator_t<R>>;

template<SortableRange R>
void normalize(R& values);
Вопрос 8 из 25
Почему концепт не должен называться просто `HasPlus`, если интерфейсу нужна упорядоченная денежная величина?
C++C++20
template<class T>
concept Money = requires(T a, T b) {
    { a + b } -> std::same_as<T>;
    { a < b } -> std::convertible_to<bool>;
    { a.currency() } -> std::same_as<Currency>;
};
Вопрос 9 из 25
Что верно о стандартном `std::same_as<T,U>`?
C++C++20
template<class T, class U>
requires std::same_as<T, U>
void merge(T& dst, const U& src);

static_assert(std::same_as<int, int>);
static_assert(std::same_as<const int, const int>);
Вопрос 10 из 25
Что даёт запись `template<std::ranges::range R>`?
C++C++20
template<std::ranges::range R>
auto first_or_default(R&& range) {
    auto it = std::ranges::begin(range);
    if (it == std::ranges::end(range)) return Value{};
    return Value(*it);
}
Вопрос 11 из 25
Главное преимущество concepts перед глубокой SFINAE-ошибкой?
Вопрос 12 из 25
Когда одна ограниченная перегрузка считается более специализированной?
Вопрос 13 из 25
Почему два концепта с одинаковым текстом, но разными атомарными ограничениями могут дать неоднозначность?
Вопрос 14 из 25
Как получить более полезную диагностику для сложного требования?
Вопрос 15 из 25
Что произойдёт, если ни одна перегрузка не удовлетворяет ограничениям?
Вопрос 16 из 25
Функция только читает диапазон один раз. Какое ограничение вероятнее всего достаточно?
C++C++20
template<std::ranges::input_range R>
std::size_t count_nonzero(R&& range) {
    std::size_t n = 0;
    for (auto&& x : range) if (x != 0) ++n;
    return n;
}
Вопрос 17 из 25
Почему ограничивать функцию `std::derived_from<Base>` иногда хуже параметра `Base&`?
C++C++20
struct Base {
    virtual ~Base() = default;
    virtual void draw() const = 0;
};

void render(const Base& object) {
    object.draw();
}
Вопрос 18 из 25
Когда static_assert внутри шаблона всё ещё уместен при наличии concepts?
Вопрос 19 из 25
Как спроектировать две версии алгоритма для random-access и обычного forward-range?
Вопрос 20 из 25
Какой концепт лучше всего выражает контракт показанного алгоритма?
C++C++20
template<class T>
concept Temperature = requires(T t) {
    { t.in_kelvin() } -> std::convertible_to<double>;
    { T::from_kelvin(0.0) } -> std::same_as<T>;
};

template<Temperature T>
double heat_loss(T inside, T outside);
Вопрос 21 из 25
Как проверить concept на этапе компиляции?
C++C++20
static_assert(std::ranges::range<std::vector<int>>);
static_assert(!std::ranges::range<int>);
static_assert(std::sortable<std::vector<int>::iterator>);
Вопрос 22 из 25
Какой негативный тест полезен для концепта WritableRange?
Вопрос 23 из 25
Почему concept `requires(T x) { x < x; }` не гарантирует строгий слабый порядок?
C++C++20
template<class T>
concept HasLess = requires(T a, T b) {
    { a < b } -> std::convertible_to<bool>;
};

struct Cyclic {
    int value;
    friend bool operator<(Cyclic a, Cyclic b) {
        return (a.value + 1) % 3 == b.value % 3;
    }
};
Вопрос 24 из 25
Как обнаружить, что концепт случайно требует копирование?
Вопрос 25 из 25
Что тестировать помимо `static_assert(Concept<T>)`?
C++C++20
template<class T>
concept WritableRange = requires(T r) {
    *std::ranges::begin(r) = std::ranges::range_value_t<T>{};
};

static_assert(WritableRange<std::vector<int>>);
// Нужны также проверки реального поведения алгоритма.

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

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

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

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