Lambda capturando objeto constexpr
O GCC 4.7.2 compila isso:
constexpr int i = 5;
[]{ std::integral_constant< int, i >(); }; // nonstandard: i not captured
mas não isso:
constexpr int i = 5;
[&i]{ std::integral_constant< int, i >(); }; // GCC says i not constexpr
Este último exemplo parece-me correcto, segundo C ++ 11 §5.1.2 / 15:
Uma entidade é capturada por referência se for implicita ou explicitamente capturada, mas não capturada por cópia. Não é especificado se membros de dados não-estáticos adicionais sem nome são declarados no tipo de fechamento para entidades capturadas por referência.
Parece que o objeto capturadoi
dentro do lambda refere-se à variável no escopo anexo, que éconstexpr
, não apenas umconst
referência.
O padrão diz explicitamente que o uso de uma captura por valor é transformado em um uso do membro correspondente do objeto lambda. E eu acho que 5.1.2 sugere que minha interpretação está correta.
Existe alguma coisa que diz explicitamente que uma captura por referência se refere ao objeto no escopo ou a uma referência?