GCC 4.7.2 компилирует это:
constexpr int i = 5;
[]{ std::integral_constant< int, i >(); }; // nonstandard: i not captured
но не это:
constexpr int i = 5;
[&i]{ std::integral_constant< int, i >(); }; // GCC says i not constexpr
Последний пример кажется мне правильным, согласно С++ 11 §5.1.2/15:
Объект захватывается ссылкой, если он неявно или явно захвачен, но не захвачен копией. Не указано, объявлены ли в типе закрытия объявленные дополнительные элементы нестатического элемента для объектов, захваченных ссылкой.
Кажется, что захваченный объект i
внутри лямбды относится к переменной в охватывающей области, которая constexpr
, а не просто ссылка const
.
В стандарте явно указано, что использование захвата по-значению преобразуется в использование соответствующего элемента лямбда-объекта. И я думаю, что 5.1.2 намекает, что моя интерпретация верна.
Есть ли что-либо, прямо указывающее, относится ли захват по ссылке к объекту в охватывающей области или ссылке?