Магистерский курс C++ (МФТИ, 2022-2023). Лекция 10. Концепты.

preview_player
Показать описание
Лекции в магистратуре МФТИ по современному C++ на русском языке. Кафедра микропроцессорных технологий.

На этой лекции мы поговорим в основном о концептах. Сначала мы обозначим проблему: хочется сделать явные шаблонные интерфейсы. Мы попробуем решить эту проблему через SFINAE несколькими способами и наткнёмся на крайне загадочные ошибки. Это приведёт нас к идее простых ограничений, а затем и более сложных ограничений. Комбинируя сложные ограничения мы придём к идее концептов и посмотрим на их частичный порядок. Концовка лекции посвящена мечтам.

Лектор: Константин Владимиров.
Дата лекции: 9 ноября 2022 года.
Съёмка и звук: Юлий Тарасов.

Timeline:
00:00 Неявные интерфейсы
08:29 SFINAE вместо контракта
19:55 if constexpr как неплохая идея
25:01 Загадочный distance
31:35 Простые ограничения и разрешение имён
49:30 Сложные ограничения
55:47 Концепты и их использование
01:07:35 Частичный порядок ограничений
01:20:00 if constexpr возвращается
01:23:20 Немного о мечтах и литература

Errata:
* тут пока пусто
Рекомендации по теме
Комментарии
Автор

Палец вверх, за простые и столь мудрые слова, классика жанра 😃

DrUlrih
Автор

58:27 К сожалению, согласно [expr.prim.req.compound] после -> может стоять лишь концепт. Необходимо писать -> same_as<T::inner>, что продемонстрировано в примере ниже по тексту стандарта
P.S. Ниже уже обращали внимание на это, но оставлю комментарий, поскольку на слайдах это всё ещё не исправлено
P.S.S. 1:06:17 Концепт SomeConcept с 42 слайда так же не исправлен. Должно быть SomeConcept<U...> T -> SomeConcept<T, U...>

Edit: Позвольте также отметить, что момент 1:07:50 в новой черновой лекции так и не был поправлен, здесь специализация: "A class or variable template declaration of a simple-template-id declares a partial specialization ([temp.spec.partial])." ([temp#pre-note-3])

ddvamp
Автор

Уровни мастерства отладки:
- использует отладчик в IDE🤕
- использует отладчик в консоли😐
- использует print'ы🙂
- смотрит AST😀
- компилирует и исполняет код в голове😇
- сразу пишет код без ошибок🤩

Юлий-ыг
Автор

1:16:37 Указатель на ссылку сформировать нельзя, так что подозреваю, что они не являются эквивалентными (или неправильно подозреваю?)
#include <iostream>

template <typename T> constexpr bool Atomic = true;

template <typename T> concept C = Atomic<T>;
template <typename T> concept D = Atomic<T *> && true;

void foo(C auto &&) { std::cout << '1'; }
void foo(D auto &&) { std::cout << '2'; }

int main() {
int x = 42;
foo(x); // 1
return 0;
}

ddvamp
Автор

Нельзя делать -> тип в requires
И подставляется первый аргумент в концепт, а не последний

На 1:08:00 как раз таки это частичная специализация. Она более ограничена чем основной шаблон

На 1:22:00 кажется хватит добавить требование, что out это output iterator как в первой перегрузке. По моему довольно понятно где ломается

niklkelbon
Автор

На слайдах 18 и 19 (31:43) синтаксическая ошибка, возвращаемое значение функции уехало вперёд requires-clause.

kyookuhmbuh
Автор

Если мы концепт ставим вместо typename в template, то компилятор подставляет первый параметр автоматически, а остальные берёт из Аргументов концепта.
template <typename T, typename ... U>
concept c_any_of = ( std::same_as<T, U> || ... );
template <c_any_of<float, int> T> void foo(T) {} // template <typename T> requires c_any_of<T, float, int> void foo(T) {}

dimon_ksi
Автор

Удивлен, что не упомянули что нельзя статик ассерт писать с независимым false

niklkelbon
Автор

Здравствуйте, спасибо за лекцию!

Можно ли концепты назвать примером того, как definition не является declaration?
Из-за дополнительный правил кажется, что:
concept foo = <definition> ;
<implicit declaration foo>

Спасибо

КонстантинНестеров-ви
Автор

Константин, спасибо за очередную крутую лекцию )

alex_s_ciframi