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

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

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

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

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

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

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

Ответы

Ответ 1

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

Пересмотрено EWG в Портленде-2012, приступив к следующему документу.

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

с:

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

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