При голосовании 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),

Другие вопросы по тегам