Templates and generic programming
T.23
Различайте уточнённый концепт и его более общий случай, добавляя новые паттерны использования
Причина
Иначе компилятор не сможет автоматически различить их.
Пример
template<typename I>
// Примечание: input_iterator определён в <iterator>
concept Input_iter = requires(I iter) { ++iter; };
template<typename I>
// Примечание: forward_iterator определён в <iterator>
concept Fwd_iter = Input_iter<I> && requires(I iter) { iter++; };
Компилятор может определить уточнение на основе наборов требуемых операций (здесь — постфиксный ++). Это снижает нагрузку на реализаторов этих типов, поскольку им не нужны специальные объявления для «подключения к концепту». Если два концепта имеют абсолютно одинаковые требования, они логически эквивалентны (уточнение отсутствует).
Контроль
Для их разграничения см. T.24.
- Помечать концепт, имеющий ровно те же требования, что и другой уже встреченный концепт (ни один не является более уточнённым).