Существуют ли технические ограничения, препятствующие этому, или случай использования слишком неясен / редок, чтобы оправдать языковое правило для него?
Да, существует технический ограничение, предотвращающее это. Этот код уже имеет значение .
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){}
.