Quelle est la différence entre constexpret const? Quand puis-je utiliser un seul d'entre eux? Quand puis-je utiliser les deux et comment en choisir un?
constexpr est un modificateur introduit dans C ++ 11, qui informe le compilateur que la valeur d'une fonction ou d'une variable est connue ou peut être calculée au moment de la compilation. En tant que tel, il peut être utilisé comme constante dans des endroits où il ne pourrait pas l'être autrement.
Quelle est la différence entre constexpret const? Quand puis-je utiliser un seul d'entre eux? Quand puis-je utiliser les deux et comment en choisir un?
Il me semble qu'avoir une "fonction qui renvoie toujours 5" brise ou dilue le sens de "appeler une fonction". Il doit y avoir une raison, ou un besoin pour cette capacité, sinon ce ne serait pas en C ++ 11. Pourquoi est-il là? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int...
Je veux avoir un static const chartableau dans ma classe. GCC s'est plaint et m'a dit que je devrais utiliser constexpr, bien que maintenant il me dise que c'est une référence indéfinie. Si je fais du tableau un non-membre, il se compile. Que se passe-t-il? // .hpp struct foo { void bar(); static...
Si j'ai une variable à l'intérieur d'une fonction (par exemple, un grand tableau), est-il logique de la déclarer à la fois staticet constexpr? constexprgarantit que le tableau est créé au moment de la compilation, serait- staticil inutile? void f() { static constexpr int x [] = { // a few thousand...
Utilisation de C ++ 11, Ubuntu 14.04, la chaîne d'outils par défaut de GCC . Ce code échoue: constexpr std::string constString = "constString"; erreur: le type 'const string {aka const std :: basic_string}' de la variable constexpr 'constString' n'est pas littéral ... parce que ... 'std ::...
Considérez la fonction intégrée suivante: // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } et la version équivalente de constexpr: //...
À la toute fin du discours de Scott Schurr "Présentation constexpr" à la CppCon , il demande "Y a-t-il un moyen d'empoisonner une fonction"? Il explique ensuite que cela peut être fait (bien que de manière non standard) en: Mettre un throwdans une constexprfonction Déclarer un non résolu extern...
J'essaie de calculer la longueur d'une chaîne littérale au moment de la compilation. Pour ce faire, j'utilise le code suivant: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"), length("abcdefgh"));...
Où devrais-je préférer les macros et où devrais-je préférer constexpr ? Ne sont-ils pas fondamentalement les mêmes? #define MAX_HEIGHT 720 contre constexpr unsigned int max_height = 720;
J'ai une fonction qui prend une dimension multidimensionnelle std::vectoret nécessite que la profondeur (ou le nombre de dimensions) soit transmise en tant que paramètre de modèle. Au lieu de coder en dur cette valeur, je voudrais écrire une constexprfonction qui prendra std::vectoret retournera la...
TL; DR Avant d'essayer de lire tout ce post, sachez que: une solution au problème présenté a été trouvée par moi - même , mais j'ai toujours hâte de savoir si l'analyse est correcte; J'ai regroupé la solution dans une fameta::counterclasse qui résout quelques bizarreries restantes. Vous pouvez le...
Notre équipe travaille avec une base de code C ++ de 10 ans et plus et est récemment passée à un compilateur C ++ 17. Nous recherchons donc des moyens de moderniser notre code. Lors d'une conférence sur YouTube, j'ai entendu la suggestion de remplacer const char*les chaînes mondiales par constexpr...
Je jouais avec autoen std::pair. Dans le code ci-dessous, la fonction fest censée retourner un std::pairtype qui dépend d'un paramètre de modèle. Un exemple pratique: EXEMPLE 1 template <unsigned S> auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if constexpr (S...
Je déconnais avec c ++ 20 consteval dans GCC 10 et écrivais ce code #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&& pred,...
Est-ce un C ++ valide? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC et MSVC pensent que c'est OK, Clang pense que ce n'est pas le cas: Compiler Explorer . Tous les compilateurs conviennent que celui-ci est OK: Explorateur de compilateurs . int main() { constexpr auto p =...
En C ++ 20, std::swapdevient une constexprfonction. Je sais que la bibliothèque standard était vraiment en retard sur le langage pour marquer les choses constexpr, mais en 2017, elle <algorithm>était à peu près constante, tout comme un tas d'autres choses. Pourtant - std::swapne l'était pas....
J'ai essayé des expressions const qui sont évaluées au moment de la compilation. Mais j'ai joué avec un exemple qui semble incroyablement rapide lorsqu'il est exécuté au moment de la compilation. #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); }...
Le code suivant est-il légitime? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clang l'accepte, mais GCC et MSVC le rejettent. L'erreur de GCC est: main.cpp:15:18: error: 'constexpr...
Tous les constructeurs de std :: span sont déclarés constexpr, mais je n'arrive pas à faire fonctionner l'un d'eux dans un contexte constexpr. La suppression de la mise en commentaire de l'un des constexpr ci-dessous entraînera une erreur de compilation. #include <array> #include <span>...