Ограничения типа также можно использовать для ограничения типов, вместо которых используются заменители auto, auto* и
auto&. Причем везде, где используется auto, также можно указывать ограничение типа: для определения локальных переменных,
для типа результат функции, в лямбда-выражениях и т. д. Всякий раз, когда конкретный тип, который будет применяться вместо auto,
не удовлетворяет ограничению типа, компилятор выдает ошибку.
Рассмотрим пример:
#include <iostream>
#include <concepts>
template <typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;
Numeric auto sum(Numeric auto a, Numeric auto b)
{
const Numeric auto result{a + b };
return result;
}
int main()
{
std::cout << sum(10, 3) << std::endl; // 13
std::cout << sum(10.6, 3.2) << std::endl; // 13.8
}
Здесь определен концепт Numeric, который предполагает, что тип T должен представлять целое число (std::integral<T>), либо число с плавающей точкой
(std::floating_point<T>).
В определении функции sum рядом с заместителем типа auto применяем данный концеп, ограничивая возможный набор используемых типов, только числовыми типами. Причем это
делам для типа результата функции:
Numeric auto sum
Для типа параметров
(Numeric auto a, Numeric auto b)
Для константы внутри функции
const Numeric auto result{a + b };
Затем можно вызывать эту функцию sum, передавая в нее числа, как целые, так и с плавающей точкой:
sum(10, 3) // 13 sum(10.6, 3.2) // 13.8