struct Test
{
static const int value = []() -> int { return 0; } ();
};
Avec gcc-4.6, je reçois quelque chose comme, error: function needs to be constexpr
. J'ai essayé plusieurs combinaisons de mettre constexpr
à divers endroits, mais pas de chance.
constexpr
est-il également pris en charge pour les fonctions lambda (quel que soit le type return
spécifié ou non)? Quelle est la syntaxe correcte?
Des contournements possibles?
Mise à jour : à partir de C++ 17, les lambdas sont autorisés dans les expressions constantes.
Les lambdas ne sont actuellement pas (C++ 14) autorisés dans les expressions constantes selon [expr.const]/(2.6), mais ils le feront une fois N4487 est accepté (qui se trouve dans le projet de travail N4582):
Cette proposition suggère d'autoriser expressions-lambda dans les expressions constantes, supprimant une restriction existante. Les auteurs proposent que certains lambda-expression s et opérations sur certains objets de fermeture soient autorisés à apparaître dans des expressions constantes. Ce faisant, nous proposons également qu'un type de fermeture soit considéré comme un type littéral si le type de chacun de ses membres de données est un type littéral; et que si le spécificateur
constexpr
est omis dans le lambda-declarator, que l'opérateur d'appel de fonction généré soitconstexpr
s'il satisfait aux exigences d'une fonctionconstexpr
(similaire à l'inférenceconstexpr
qui se produit déjà pour les constructeurs définis implicitement et les fonctions d'opérateur d'affectation).
À partir du C++ 0x FDIS §7.1.5 [dcl.constexpr]/1:
Le spécificateur
constexpr
ne doit être appliqué qu'à la définition d'une variable, à la déclaration d'une fonction ou d'un modèle de fonction, ou à la déclaration d'un membre de données statique d'un type littéral.
Une expression lambda n'est rien de tout cela et ne peut donc pas être déclarée constexpr
.
Avant C++ 17 les lambdas ne sont pas compatibles avec constexpr
. Ils ne peuvent pas être utilisés dans expressions constantes.
À partir de C++ 17 les lambdas sont constexpr
là où cela a du sens. La proposition N4487 sera placée dans la norme C++ 17. Le son site Web Herb Sutter, président du comité ISO C++, a déclaré ce qui suit:
Les Lambdas sont maintenant autorisés dans les fonctions constexpr .
FFWD à l'année 2018 :)
auto my_const_expression_lambda = []()
constexpr -> bool
{
return true ;
}
Depuis c ++ 17