web-dev-qa-db-fra.com

Constexpr est-il pris en charge avec les fonctions / expressions lambda?

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?

56
iammilind

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é soit constexpr s'il satisfait aux exigences d'une fonction constexpr (similaire à l'inférence constexpr qui se produit déjà pour les constructeurs définis implicitement et les fonctions d'opérateur d'affectation).

27
Columbo

À 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.

25
James McNellis

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 .

10
Ralph Tandetzky

FFWD à l'année 2018 :)

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

Depuis c ++ 17

3
user5560811