Il est very natural de vouloir comparer std::array
au moment de la compilation; et son operator==()
est évidemment constexpr
. Pourtant - il isn't marqué constexpr
. Est-ce intentionnel ou un oubli? Et - quelle est la raison pour laquelle il a été laissé comme ça (apparemment aussi en C++ 17)?Pourquoi l'opérateur std :: array n'est pas ==() marqué constexpr?
Répondre
P0031 expliqué pourquoi il n'a pas proposé constexpr
comparaisons:
comparaisons Actuellement et
swap
/fill
peut être mis en œuvre avec l'aide d'algorithmes d'en-tête<algorithm>
. Marquer des comparaisons avec constexpr va casser cette capacité et conduira potentiellement à des dégradations de performance .
Par exemple, ==
peut être mis en œuvre en termes de std::equal
, qui - dans les cas appropriés - peut appeler le très optimisé mais résolument-Dégraissé constexpr
memcmp
. La création de constexpr
pour ==
exclura cette optimisation sans assistance spéciale du compilateur.
La raison peut-être ceci: ==
d'un tableau ne peut être qu'un constexpr
si ==
de type contenu est un constexpr
aussi.
Puisque le conteneur ne peut pas appliquer cela, il ne peut pas (généralement) offrir un operator==() constexpr
.
La première phrase est vraie pour toute fonction constexpr basée sur un modèle qui fait n'importe quoi avec son paramètre de modèle. Et - ceux-ci peuvent très bien être fait «constexpr» ... alors ce n'est pas ça. (PS - Not my downvote.) – einpoklum
J'ai du mal à penser à une fonction constexpr basée sur un modèle qui mérite ce nom et qui traite des membres de type non-constexpr ... –
Daniel Kruger dit: Cela peut être résolu quand/si la proposition [P0202] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0202r1.html) est adopté. – einpoklum