Question

Lié: La fonction renvoyant constexpr ne compile pas

J'ai l'impression que ConstexPR est limité dans l'utilité dans C ++ 11 en raison de l'incapacité de définir deux fonctions qui auraient autrement la même signature, mais qui en auraient une constexpr et l'autre non constexpr. En d'autres termes, il serait très utile que je puisse, par exemple, un constructeur Consxpr STD :: String qui prend uniquement des arguments Consxpr et un constructeur de chaîne non constexpr STD :: pour les arguments non-constexpr. Un autre exemple serait une fonction théoriquement compliquée qui pourrait être rendue plus efficace en utilisant l'état. Vous ne pouvez pas facilement le faire avec une fonction constexpr, vous vous retrouvez donc avec deux choix: ayez une fonction constexpr qui est très lente si vous passez dans des arguments non contestexpr, ou abandonnez entièrement constexpr (ou écrivez deux fonctions distinctes, mais vous ne savez peut-être pas quelle version appeler).

Ma question est donc la suivante:

Est-il possible pour une implémentation C ++ 11 conforme à la norme pour permettre la surcharge de fonction en fonction des arguments constitués, ou cela nécessiterait-il de mettre à jour la norme? S'il n'est pas autorisé, n'a-t-il pas été intentionnellement autorisé?


@Nicolbolas: disons que j'ai une fonction qui mappe un enum à un std::string. La façon la plus simple de le faire, en supposant mon enum va de 0 à n - 1, c'est créer un tableau de taille n rempli du résultat.

Je pourrais créer un static constexpr char const * [] et construire un std::string en retour (payer le coût de la création d'un std::string objet chaque fois que j'appelle la fonction), ou je peux créer un static std::string const [] et renvoyer la valeur que je recherche, en payant le coût de tous les std::string constructeurs la première fois que j'appelle la fonction. Il semble qu'une meilleure solution serait de créer le std::string en mémoire au moment de la compilation (similaire à ce qui est fait maintenant avec char const *), mais la seule façon de le faire serait d'alerter le constructeur qu'il a constexpr arguments.

Pour un exemple autre qu'un std::string Constructeur, je pense qu'il est assez simple de trouver un exemple où, si vous pouviez ignorer les exigences de constexpr (et ainsi créer un nonconstexpr fonction), vous pouvez créer une fonction plus efficace. Considérez ce fil: Question constexpr, pourquoi ces deux programmes différents se déroulent-ils dans un temps si différent avec G ++?

Si j'appelle fib avec un constexpr Argument, je ne peux pas battre faire mieux que le compilateur optimisant complètement l'appel de fonction. Mais si j'appelle fib avec un nonconstexpr Argument, je peux vouloir l'appeler ma propre version qui implémente des choses comme la mémoire (qui nécessiterait un état) afin que j'obtienne un temps d'exécution similaire à ce qui aurait été mon temps de compilation si j'avais passé un constexpr dispute.

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top