Могут ли быть заданы лямбда-шаблоны C ++ 20 для вывода типа, вложенного в аргумент? - PullRequest
1 голос
/ 08 октября 2019

C ++ 20 лямбда-выражений получают новую функцию (документ p0428r2.), Вы можете указать <typename T> как в обычной функции ... Читая эту статью, я заметил один пример:

auto f = []<typenameT>(std::vector<T> vector) { /* ... */ };

Это получилоя думаю:

Почему язык не "выясняет", что T является типом (поскольку std :: vector является шаблоном, который ожидает параметр типа внутри <>).

auto f = [](std::vector<T> vector) { /* T deduced ... */ };

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

1 Ответ

7 голосов
/ 08 октября 2019

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

Да, существует технический ограничение, предотвращающее это. Этот код уже имеет значение .

struct T { int i; };
auto f = [](std::vector<T> vector) { /* T not actually deduced */ };

. Шаблоны очень отличаются от шаблонов (подробное описание см. P1392 ). Одна из причин того, что понятия «краткий» синтаксис пишется concept auto x вместо просто concept x, заключается в том, что многие люди твердо хотели, чтобы один и тот же синтаксис не означал совершенно разные вещи, основанные на типе используемого имени.

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

Концепции TS имели другой синтаксис для этого, который был:

auto f = [](std::vector<auto> vector) { /* deduced, but no name */ };

Кажется вероятным, что эта функция TS Концепций будет предложена для C ++ 23, поскольку она, безусловно, будет полезна дляпо той же причине, по которой я все равно буду писать [](auto x){} во многих местах вместо []<class T>(T x){}.

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