web-dev-qa-db-fra.com

Nouvelles exigences de l'itérateur

J'ai remarqué que la plupart des conteneurs, sinon tous, nécessitent désormais leur ::iterator tapez pour satisfaire LegacySomethingIterator au lieu de SomethingIterator.

Par exemple, std::vector<>::iteratornécessite désormais :

iterator LegacyRandomAccessIterator

Cela semble être le même pour la plupart des autres conteneurs, tous nécessitant que leurs itérateurs passent de SomethingIterator à LegacySomethingIterator.

Il y a aussi les "nouvelles" exigences qui ont pris les noms des anciennes exigences, comme RandomAccessIterator , pourquoi ont-elles été ajoutées? Il me semble que les nouvelles variantes ne font que masquer les variantes héritées, aucune différence.

Pourquoi de nouveaux ont-ils été créés en premier lieu, leurs exigences me semblent identiques. Pourquoi les nouvelles ne remplacent-elles pas simplement les anciennes exigences au lieu d'avoir en ce moment 2 noms différents pour elles (par exemple RandomAccessIterator et LegacyRandomAccessIterator)?

32
Sombrero Chicken

Ce ne sont pas des choses nouvelles, d'où le terme "héritage". C'est simplement la façon dont le site cppreference choisit de concilier le fait que C++ 20 aura deux choses différentes qui sont toutes les deux des "concepts" appelés "RandomAccessIterator".

Avant C++ 20, un "concept" n'était qu'un ensemble d'exigences dans la norme qui représentait le comportement attendu de certains paramètres de modèle. En C++ 20, avec les concepts devenant une véritable fonctionnalité de langage, cela devait changer. Le problème est que les plages concept de "RandomAccessIterator" sont pas les mêmes comme le "concept" à l'ancienne de "RandomAccessIterator".

Puisque C++ les considère tous les deux comme des "concepts" (bien que seul le plus récent soit un concept au sens du langage), ils auraient tous les deux le même nom de page sur le Wiki. Et MediaWiki ne le permet pas vraiment.

Les responsables du site ont donc décidé d'utiliser "Legacy" pour les différencier. Notez que le véritable standard n'utilise pas ce préfixe "Legacy".

Notez que la norme C++ 20 a un préfixe pour les anciens concepts: "Cpp17". Ainsi, l'ancien concept serait "Cpp17RandomAccessIterator". Cela n'a pas été jugé approprié pour la Conférence pour des raisons évidentes.

26
Nicol Bolas