При голосовании P1141R1, сколько типов выводится из нескольких выведенных параметров с одинаковым ограничением?
Согласно Концепции TS, в то время как выводимый параметр без ограничений каждый раз выдает новый параметр типа шаблона, выводимые параметры с ограничениями дают только один параметр типа шаблона на ограничение:
[](auto a, auto b) // IS-A
[]<class ArgA, class ArgB>(ArgA a, ArgB b)
[](Constraint a, Constraint b) // IS-A
[]<Constraint Type>(Type a, Type b)
Теперь за P1141R1 проголосовали (см . Отчет о поездке Херба Саттера), и он вновь вводит короткий синтаксис для ограниченных выводимых параметров с "прилагательным синтаксисом" для ограниченного auto:
void fun(Constraint auto a, Constraint auto b);
с понятием, что "появление auto
(в том числе Constraint auto
) в списке параметров говорит нам, что мы имеем дело с шаблоном функции."
Однако нет информации о том, сколько отдельных типов мог бы дать такой синтаксис. Таким образом, вопрос заключается в следующем: для двух ограниченных выводимых параметров с одинаковым ограничением (как указано выше), будет ли шаблон с одним параметром типа или правила будут ослаблены из-за наличия auto
ключевое слово?
Изменить: тип шаблона аргумент параметр.
2 ответа
Люди должны действительно прекратить писать вводящие в заблуждение отчеты о поездках со ссылками на устаревшие документы, по крайней мере, без гигантской неоново-розовой оговорки. За документ проголосовал P1141R2, который будет доступен для общественности через несколько недель. Утвержденная конструкция примерно соответствует частям 1, 3 и 4 P1141R1.
Вы получаете независимую привязку, т.е. два параметра шаблона в вашем примере:
Сокращенный шаблон функции эквивалентен шаблону функции (17.6.5), чей шаблон-параметра-списка включает в себя один шаблон-параметр изобретенного типа для каждого вхождения типа заполнителя в decl-specier-seq объявления- параметра в функции Параметр-тип-список, в порядке появления.
Это было ожидаемое направление, по крайней мере, с начала этого года.
Эта декларация:
void fun(Constraint auto a, Constraint auto b);
означает, что мы делаем так называемое "независимое связывание".
Это означает то же самое, что и более длинный синтаксис частичного концепта:
template <Constraint _T, Constraint _U>
void fun(_T a, _U b);
и еще более длинный полный синтаксис require-clause:
template <typename _T, typename _U>
requires Constraint<_T> && Constraint<_U>
void fun(_T a, _U b);
кроме того, что у вас нет доступа к именам _T
а также _U
(если вам нужны эти имена типов, вам нужно прибегнуть к одной из более длинных опций синтаксиса).
Для длинного списка аргументов относительно того, почему "независимое связывание" является лучшим выбором, чем "согласованное связывание", см. P0464: Пересмотр значения foo(ConceptName, ConceptName)
,