¿Constexpr es compatible con funciones / expresiones lambda?

struct Test { static const int value = []() -> int { return 0; } (); }; 

Con gcc-4.6 me sale algo así como, error: function needs to be constexpr . He intentado varias combinaciones de poner constexpr en varios lugares, pero no constexpr suerte.

¿ constexpr compatible constexpr para funciones lambda (independientemente del tipo de return especificado o no)? Cual es la syntax correcta ?

Cualquier trabajo alrededor posible?

Actualización : A partir de C ++ 17, las lambdas están permitidas en expresiones constantes.


Actualmente, las lambdas (C ++ 14) no están permitidas en expresiones constantes según [expr.const] / (2.6), pero se aceptarán una vez que se acepte N4487 (que se puede encontrar en el borrador de trabajo N4582):

Esta propuesta sugiere permitir expresiones lambda en expresiones constantes, eliminando una restricción existente. Los autores proponen que se permita que ciertas expresiones lambda y operaciones en ciertos objetos de cierre aparezcan dentro de expresiones constantes. Al hacerlo, también proponemos que un tipo de cierre se considere un tipo literal si el tipo de cada uno de sus miembros de datos es un tipo literal; y, si el especificador constexpr se omite dentro del declarador lambda, que el operador de llamada a función generada sea constexpr si satisface los requisitos de una función constexpr (similar a la constexpr que ya ocurre para los constructores implícitamente definidos y el operador de asignación) funciones).

Del C ++ 0x FDIS §7.1.5 [dcl.constexpr] / 1:

El especificador constexpr se aplicará solo a la definición de una variable, la statement de una función o plantilla de función, o la statement de un miembro de datos estáticos de un tipo literal.

Una expresión lambda no es ninguna de esas cosas y, por lo tanto, no puede declararse constexpr .

Antes de C ++ 17 lambdas no son compatibles con constexpr . No pueden usarse dentro de expresiones constantes .

Comenzando con C ++ 17 lambdas son constexpr donde tiene sentido. La propuesta N4487 se incluirá en el estándar C ++ 17. En su sitio web, Herb Sutter, presidente del comité ISO C ++, declaró lo siguiente:

Las lambdas ahora están permitidas dentro de las funciones constexpr .

FFWD hasta el año 2018 🙂

 auto my_const_expression_lambda = []() constexpr -> bool { return true ; } 

Desde c ++ 17