Toute fonction qui se compose d'une instruction de retour ne pourra être déclaré
constexpr
et donc va permettre d'être évalués au moment de la compilation si tous les
les arguments sont constexpr
et seulement constexpr
fonctions sont appelées dans son
corps. Est-il une raison de ne pas déclarer tout ce genre de fonction constexpr
?
Exemple:
constexpr int sum(int x, int y) { return x + y; }
constexpr i = 10;
static_assert(sum(i, 13) == 23, "sum correct");
Quelqu'un pourrait-il donner un exemple où la déclaration d'une fonction constexpr
peut faire du mal?
Quelques réflexions:
Même si il ne devrait y avoir aucune bonne raison pour jamais de la déclaration d'une fonction
pas constexpr
je ne pouvais imaginer que l' constexpr
mot a un
transition: son absence dans le code qui n'a pas besoin de compilation
les évaluations permettrait compilateurs qui ne mettent pas en œuvre au moment de la compilation
les évaluations encore pour compiler ce code (mais à l'échec de manière fiable sur le code
qui a besoin d'eux comme fait explicit en utilisant constexpr
).
Mais ce que je ne comprends pas: si il devrait y avoir aucune bonne raison pour
jamais de la déclaration d'une fonction non constexpr
, pourquoi pas chaquefonction
dans la bibliothèque standard déclarée constexpr
? (On ne peut pas discuter
qu'il n'est pas encore fait parce que il n'y avait pas suffisamment de temps encore
le faire, parce que le faire pour tous est une évidence, contrairement à la décision de la
pour chaque fonction, si le faire constexpr
ou pas.)
--- Je suis conscient que N2976
délibérément nécessite pas cstrs pour de nombreux standard de la bibliothèque de types
comme les conteneurs que ce serait trop réducteurs pour possible
les implémentations. Permet de les exclure de l'argument et me demande:
une fois un type dans la bibliothèque standard a fait un constexpr
cstr, pourquoi pas
toutes les fonctions d'exploitation sur ce qu'il a déclaré constexpr
?
Dans la plupart des cas, vous ne pouvez pas prétendre que vous ne souhaitez pas déclarer une fonction
constexpr
tout simplement parce que vous n'avez pas envisager n'importe quel moment de la compilation d'utilisation:
parce que si les autres evtl. permettra d'utiliser votre code, ils peuvent voir une telle utilisation que
vous n'avez pas. (Mais pour le type de trait types et des choses semblables, bien sûr.)
Donc je suppose qu'il doit y avoir une bonne raison et un bon exemple pour délibérément
de ne pas déclarer une fonction constexpr
?
(avec "toutes les fonctions" j'ai toujours dire: chaque fonction qui répond aux
conditions pour être constexpr
, c'est à dire, est défini comme un
instruction de retour, ne prend que des arguments de types avec constexpr
cstrs et ne fait appel qu' constexpr
fonctions.)
La question Pourquoi est - std::forward
jetez - constexpr
-ness?
est un cas particulier de celui-ci.