Ответ 1
Если это считать ошибкой в clang 3.8?
Угу. Захват нужен только в том случае, если [expr.prim.lambda]/12 требует:
Обратите внимание, в частности, на выделенный пример. f(x)
не требует захвата x
, потому что он не используется odr (разрешение перегрузки выбирает перегрузку с параметром объекта). Такая же аргументация применяется к вашему коду - [basic.def.odr]/3:
Переменная
x
, имя которой отображается как потенциально оцененное выражениеex
является odr-используемымex
, если не применить преобразование lvalue-to-rvalue (4.1) доx
дает постоянное выражение (5.20), которое не вызывает любые нетривиальные функции...
Это требование, безусловно, выполнено.
... и, если
x
является объектом,ex
является элементом набор потенциальных результатов выраженияe
, где либо Преобразование lvalue-to-rvalue (4.1) применяется кe
, илиe
является выражение сброшенного значения (раздел 5).
i
- это его набор потенциальных результатов в соответствии с [basic.def.odr]/(2.1), и преобразование ltr действительно применяется сразу же, поскольку оно передается нестандартному шаблону параметра типа объекта.
Следовательно, как мы показали, (12.1) неприменимо - и (12.2), очевидно, тоже не является - Clang ошибочно отвергает ваш фрагмент.