Українська
Підсумки
Висновки
Шаблон описує спільний алгоритм один раз, а компілятор утворює потрібні спеціалізації для відомих під час компіляції аргументів. Виведення типів не шукає зручного спільного типу, тому сигнатура шаблону є частиною контракту. Шаблон класу може мати параметр-значення, і тоді FixedStack<int, 2> та FixedStack<int, 3> – різні типи, а CTAD виводить аргументи лише з конструктора. Спеціалізація класу замінює поведінку для визначених аргументів, а для функцій зазвичай використовують перевантаження або обмеження. Для неявного інстанціювання визначення шаблону має бути видимим, тому його розміщують у заголовку. Пакети параметрів і fold-вирази розгортаються під час компіляції й не є контейнером часу виконання. Концепти та requires виражають точні вимоги до типів і переносять діагностику ближче до інтерфейсу, але не доводять семантичної правильності операцій. Статичний поліморфізм вибирає реалізацію під час інстанціювання й не замінює віртуального інтерфейсу для різнорідних колекцій.
Питання для самоперевірки
- Чому
maxOf(3, 7.5)не виводить один T? - Які типи й операції справді підтримує навчальний FixedStack?
- Чому CTAD не може вивести місткість із порожнього конструктора?
- Чим спеціалізація класу відрізняється від перевантаження функції?
- Яка інформація потрібна для неявного інстанціювання?
- Чим requires-речення відрізняється від requires-виразу?
- Чи доводить концепт семантичну правильність оператора порівняння?
- Чому порожній fold через кому працює, а через + потребує рішення?
- Де варто використати
static_assertзамість концепту? - Коли потрібен динамічний вибір реалізації замість шаблону?
Контрольні питання до лабораторної роботи
- Що є аргументом типу, а що аргументом-значенням?
- Які обмеження вашого типу перевіряються компілятором?
- Які властивості залишилися перевірками часу виконання?
- Чим гарантія CTAD відрізняється від перевірки конструктора?
- Чому тест відмови не можна замінити коментарем?