Разрешено (или будет ли) использование знакомого синтаксиса шаблона в лямбда-выражениях?
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 может быть нестандартной).