43 votes

Est-il valable pour un lambda de se fermer sur lui-même?

Cette récursion lambda est-elle valide?

 #include <functional>
#include <iostream>

int main() {
   std::function<int(int)> g = [&g](int k) {
       return (k ? k * g(k-1) : 1);
   };

   std::cout << g(10); // 3628800
}
 

Il semble que la compilation et l’exécution s’effectuent bien , mais j’ai peur de fermer g dans la même déclaration que celle que j’ai initialisée. Validité stricte sur une échelle de 1-10 ...?

22voto

Mike Seymour Points 130519

Au moment de la capture d' g par référence, il a été déclaré, de sorte que le nom est disponible pour une utilisation:

3.3.2/1 Le point de la déclaration d'un nom est immédiatement après sa complète de demande de déclaration (article 8) et avant son initialiseur

Vous êtes autorisé à utiliser des objets de façon limitée avant qu'ils sont initialisées - en gros, tout ce qui ne dépend pas de la valeur est OK:

3.8/6 avant la durée de vie d'un objet a commencé, mais après la de stockage dont l'objet s'occuper a été attribué [...] toute glvalue qui fait référence à l'objet d'origine peuvent être utilisés, mais uniquement dans certaines façons. [...] en utilisant les propriétés de la glvalue qui ne dépendent pas de sa valeur est bien définie.

Donc, selon ma compréhension, ce que vous faites est bien définie.

(Bien que, étant ultrapedantic, je ne pense pas qu'il est spécifié lorsque le stockage automatique de l'objet est alloué, et 8.3.2/5 dit que "une référence doit être initialisée à se référer à un objet valide", sans définir "valide", il n'est donc portée à dire, que c'est pas bien définie).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X