Пара связанных вопросов для гуру стандартов C ++.
Входящая в C ++ 20 вводит лямбда-выражения шаблонов (P0428R2).
Так что вместо
auto x = [](auto x, auto y){ return x+y; };
мы можем указать параметр шаблона следующим образом
auto x = []<typename T>(T x, T y){ return x+y; };
Все идет нормально.
Первый вопрос: могут ли явные параметры шаблона в лямбдах шаблона быть выведены только из аргументов или можно добавить невыведенные аргументы шаблона?
Читая P0428r1, я не вижу явных ограничений, но я также не вижу примеров невыведенных аргументов шаблона.
В первом приближении я полагаю, что невыведенные аргументы шаблона допустимы, потому что я вижу, что следующий глупый код
int main()
{
[]<int = 0>(){ }();
}
компилируется и запускается как с g ++ (заголовок 10.0.0), так и с clang ++ (заголовок 10.0.0).
Предположим, что невыведенные параметры шаблона разрешены, второй вопрос: как я могу вызвать лямбда-выражение шаблона, указав параметр шаблона?
На примере: учитывая следующий шаблон лямбда
auto x = []<std::size_t I>(auto t){ return std::get<I>(t); };
Есть ли какой-нибудь синтаксис для указания параметра шаблона I
при вызове таких лямбда-выражений без явного именования operator()
?
Я пробовал с
x<0u>(y);
но <
интерпретируется как оператор отношения.
Я пробовал просто добавить template
x template <0u>(y);
но это не работает.
[]<std::size_t I>(std::integral_constant<std::size_t, I>, auto t) {} (std::integral_constant<std::size_t, 0>{}, ...)
. - person Evg   schedule 04.01.2020operator()
лямбда, как и параметры функцииauto
. Следовательно, если вы хотите предоставить аргументы шаблона напрямую, вы должны использовать точно такой же синтаксис, как и для любых другихoperator()
, где вы хотите предоставить аргументы шаблона. - person Nicol Bolas   schedule 04.01.2020<
* список-параметров-шаблонов *>
, и нет установленных ограничений на то, что может входить в этот список параметров шаблона. Не уверен, что не понимаю. - person Raymond Chen   schedule 04.01.2020