10 votes

Implicit constexpr ?

Est-ce que les compilateurs C++11 peuvent (et le font-ils) remarquer qu'une fonction est constexpr et les traiter en tant que telles même si elles ne sont pas déclarées comme telles constexpr ?

Je démontrais l'utilisation de constexpr à quelqu'un en utilisant l'exemple directement depuis Wikipédia :

int get_five() {return 5;}

int some_value[get_five() + 7]; // Créer un tableau de 12 entiers. C++ mal formé

À ma grande surprise, le compilateur a accepté cela. J'ai ensuite modifié get_five() pour prendre quelques paramètres int, les multiplier et retourner le résultat tout en n'étant pas explicitement déclaré comme constexpr. Le compilateur a également accepté cela. Il semble que si le compilateur peut le faire, il n'y a pas beaucoup d'intérêt à avoir les restrictions nécessaires pour déclarer quelque chose explicitement constexpr.

7voto

Jerry Coffin Points 237758

Avec un compilateur C++11 fonctionnant correctement, votre code serait rejeté.

Comme il est accepté, vous utilisez très probablement gcc (ou quelque chose qui émule de près ses bugs). gcc [en fonction des options] peut accepter des tailles de tableau qui ne sont pas constantes selon toutes mesures (par exemple, dépendent de l'entrée en temps d'exécution de l'utilisateur) car ils supportent une analogie des tableaux de longueur variable de C99 en C++.

3voto

GCC, à partir de GCC 12, prend en charge l'option en ligne de commande -fimplicit-constexpr qui permet précisément cela, pour les méthodes marquées comme inline.

2voto

Zyx 2000 Points 533

Un compilateur peut détecter si une fonction aurait pu être déclarée avec constexpr même si elle ne l'a pas été, à des fins d'optimisation (c'est-à-dire calculer le résultat d'une fonction à la compilation). Les compilateurs faisaient cela avant C++11.

Mais pour une utilisation dans des endroits qui nécessitent des expressions constantes, comme les paramètres de modèle de type intégral, il est contraire à la norme de permettre des appels à des fonctions qui ne sont pas déclarées avec le mot-clé constexpr.

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