¿constexpr es compatible con funciones / expresiones lambda?


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

Con gcc-4.6 obtengo algo como, error: function needs to be constexpr. He intentado múltiples combinaciones de poner constexpr en varios lugares, pero sin suerte.

Es constexpr compatible con las funciones lambda también (independientemente del tipo return especificado o no) ? ¿Cuál es la sintaxis correcta ?

¿Algún trabajo posible?

Author: iammilind, 2011-06-21

4 answers

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


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

Esta propuesta sugiere permitir expresiones lambda en constante expresiones, eliminando una restricción existente. Los autores proponen que cierto lambda-expresión s y operaciones sobre cierto cierre se permite que los objetos 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, que si el especificador constexpr se omite dentro del declarador lambda, que el operador de llamada a la función generado es constexpr si satisface los requisitos de una función constexpr (similar a la constexpr inferir que ya ocurre para implícitamente definido los constructores y las funciones del operador de asignación).

 23
Author: Columbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-11 16:10:38

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

El especificador constexpr se aplicará únicamente a la definición de una variable, a la declaración de una función o plantilla de función, o a la declaración de un miembro de datos estático de tipo literal.

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

 24
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-21 03:48:29

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

Comenzando con C++17 las 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é de ISO C++, declaró lo siguiente:

Las lambdas ahora son permitidas dentro de las funciones constexpr.

 9
Author: Ralph Tandetzky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 10:35:20

FFWD al año 2018:)

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

Desde c++17

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-23 23:39:37