Почему лямбда-шаблоны C ++ 20 используют ключевое слово typename? - PullRequest
1 голос
/ 07 июня 2019

Я понимаю аргумент согласованности, но большинство параметров для шаблонов являются типами, поэтому я считаю, что поскольку лямбда-выражения являются кратким способом определения структуры, ее, вероятно, следует установить по умолчанию в typename / class (вывсе равно нужно написать int/size_t/short).

Если кто-то не знаком с изменениями в лямбда-выражениях в C ++ 20, вот пример:

[]<typename T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};

и мой вопрос: почему бы и нет:

[]<T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};

Ответы [ 3 ]

7 голосов
/ 09 июня 2019

Проблема в том, что это уже имеет значение:

template <T> void foo();

Это шаблон функции с одним параметром шаблона, который является нетиповым параметром шаблона, тип которого T, и у этого параметра шаблона нет имени.

Было бы довольно странно, если бы один и тот же синтаксис означал очень разные вещи, в зависимости от того, вводите ли вы шаблон функции или общую лямбду - то есть два очень похожих контекста, служащих схожим целям !

Плюс тогда ... что бы вы сделали, если бы вы на самом деле захотели нетипичный параметр шаблона? Просто не может иметь один?

3 голосов
/ 07 июня 2019

В то время как краткость действительно является преимуществом продажи лямбд, она не настолько важна, чтобы заменить потребность в последовательности. Это особенно актуально для функций, использующих шаблоны, поскольку их сложнее понять, чем функции, не относящиеся к языку шаблонов.

В частности, синтаксис шаблона для общих лямбд в первую очередь имеет узкую область видимости, то есть большинство лямбд может жить без него (фактически, приведенный вами пример является прекрасным примером того, чтобы не использовать его в качестве тела функции). не создает экземпляр T или делает что-то сопоставимое). От P0428 (акцент мой):

Существует несколько ключевых причин, почему текущий синтаксис для определения общих лямбда-выражений считается недостаточным для автора. Суть этого в том, что некоторые вещи, которые можно легко сделать с помощью обычных функциональных шаблонов, требуют значительных скачков обручей для выполнения с обычными лямбдами или вообще не могут быть выполнены.

Общие лямбды с decltype использованием в их теле, вероятно, будут наиболее видными клиентами новых функций. И замена decltype / decay_t -критерии на <typename T> кажется мне более приемлемой с точки зрения дополнительной типизации и краткости.

2 голосов
/ 07 июня 2019

Если вы просто напишите

[]<T>(){ }

что такое T?

A typename?Значение auto?

Мне кажется, что в лямбдах, как и в обычных функциях, необходимо явно указать аргумент шаблона.

И если вы можете сделать вывод, что Tтип из использования (если он используется в качестве первого аргумента шаблона для std::vector, должен быть типом), зачем упрощать только лямбда-синтаксис, а не синтаксис традиционных функций шаблона?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...