Это объявление:
void fun(Constraint auto a, Constraint auto b);
означает, что мы делаем так называемое «независимое связывание».
Это означает то же самое, что и более длинный частичный-идентификатор-концепции синтаксис:
template <Constraint _T, Constraint _U>
void fun(_T a, _U b);
и еще более длинный полный синтаксис с требованием предложения:
template <typename _T, typename _U>
requires Constraint<_T> && Constraint<_U>
void fun(_T a, _U b);
за исключением того, что у вас нет доступа к именам _T
и _U
(если вам нужны эти имена типов, вам придется прибегнуть к одной из более длинных опций синтаксиса).
<ч />
Для длинного списка аргументов относительно того, почему «независимое связывание» является лучшим выбором, чем «согласованное связывание», см. P0464 : Пересмотр значения foo(ConceptName, ConceptName)
.