Разрешено (или будет ли) использование знакомого синтаксиса шаблона в лямбда-выражениях?

C++14 представил общие лямбды. Просматривая соответствующие предложения, я нашел N3418 Фейсала Вали, Херба Саттера и Дейва Абрахамса. Там раздел 2.2 озаглавлен:

Разрешить использование знакомого синтаксиса шаблона в лямбда-выражениях

и следующие примеры кода включают в себя такие фрагменты, как этот

[]<int N>(int (&a)[N]) {}

Поскольку такие вещи не компилируются (с помощью gcc, clang и Visual Studio), возникает несколько вопросов:

  • Это проблема реализации?
  • Что помешало этой части быть принятой?
  • Какое предложение, наконец, принесло в язык общие лямбды?

2 ответа

Решение

Версия документа, которая была принята, была N3649 мы можем убедиться в этом , обратившись к завершенной проблеме рабочей группы Evolution (EWG) 16: N3649, N3560, N3559, N3418 Предложение по общим (полиморфным) лямбда-выражениям:

Рассмотрено EWG в Портленде в 2012 г. с последующей последующей работой.

Принят в рабочий проект в Бристоле в 2013 году под номером N3649.

Бристоль 2013: Не открывайте предложения 2.1 и 2.2 в N3560, они считаются NAD. Предложения 2.3 и 2.4 охватываются N3649.

Обратите внимание на это предложение ссылки 2.1 а также 2.2 как NAD(не дефект) и что они не будут открыты. N3560 был отделен от N3418 который был основным предложением и предложением 2.1 в N3560 было:

Разрешить использование знакомого синтаксиса шаблона в лямбда-выражениях

эта бумага отмечает предложение 2.1 был признан спорным:

Мы признаем, что поддержка полного шаблона функции списка параметров были признан спорным (Портленд 2012 результатов соломенного опроса были: 7 SF, 5 F, 3 N, 1 А, 1 SA 1) несколько членов комиссии, и, следовательно, заключение этого подраздел с некоторыми цитатами члена комитета, который не присутствовал в комнате во время обсуждения EWG этой функции в Портленде.

и мы можем видеть, что N3649 не содержит это предложение, мое предположение из цитаты в газете N3560:

"Я думаю, что нам нужно больше, чем просто авто. Я не уверен, сколько еще, но я думаю, что просто авто было бы слишком ограниченным".

было то, что авто было сочтено достаточным в конце, что будет соответствовать утверждению, что предложение NAD То есть проблема, которую он пытался решить, на самом деле не является проблемой.

Примечание: я бы прокомментировал это, но не имею репутации.

Точная конструкция, которую вы цитируете, работает нормально, если я скомпилирую следующее:

auto foo = []<int N>(int (&a)[N]) {};

с:

g++-4.9 -c foo.cpp -std=c++1y

Однако, используя g++-4.8 или же clang-3.6 оба терпят неудачу. Поэтому я бы предположил, что это проблема реализации. Однако я недостаточно знаком со стандартом C++14, чтобы знать, почему / если он был принят (например, поддержка g++ 4.9 может быть нестандартной).

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