Dans plusieurs présentations récentes à la conférence, Bjarne Stroustrup et d’autres ont mentionné de nouvelles directives de codage pour C++ et certains types les prenant en charge.
Plus précisément, je me souviens de l'exemple de span<T>
au lieu de (T* p, int n)
en tant que paramètre d'une fonction (vers 32h00 environ dans la conversation); mais je me souviens aussi de la suggestion d'utiliser array_view<T>
. Sont-ils deux alternatives mais le même concept? Ou suis-je en train de confondre les choses et elles ne sont en fait pas si liées?
Je n'arrive pas à trouver une définition faisant autorité de ce qu'ils sont supposés être.
Nous avons parlé avec des personnes du groupe de travail sur les bibliothèques du comité des normes . Ils voulaient le array_view
ils essaient d'entrer dans la norme pour être en lecture seule. Pour les directives de base, nous avions besoin d’une abstraction lue et écrite. Pour éviter un conflit entre les normes (potentielles) et la bibliothèque de support de lignes directrices (GSL), nous avons renommé notre (lecture et écriture) array_view
à span
: https://github.com/Microsoft/gsl .
Dans le CppCoreGuidlines L'original array_view
a été renommé en span
.
Voir: https://github.com/isocpp/CppCoreGuidelines/pull/377
Il est décrit ainsi:
span est une alternative sûre et sécurisée à l'utilisation de pointeurs pour accéder aux tableaux
Le document P0122R (2016-02-12) du groupe de travail sur l'évolution de la bibliothèque (LEWG)
renomme officiellement le type array_view
en span
:
Changelog
Changements depuis R0
- Le nom du type proposé de
array_view
A été remplacé parspan
à la suite des commentaires du LEWG lors de la réunion de Kona.- [...]
On peut aussi lire:
Impact sur la norme
Cette proposition est une extension de bibliothèque pure. Il ne nécessite aucune modification des classes, fonctions ou en-têtes standard. Il serait amélioré si cela dépendait du type
byte
et des modifications apportées au comportement d'alias de type proposé dans P0257 .Cependant, si elle est adoptée, il peut être utile de surcharger certaines fonctions de bibliothèque standard pour ce nouveau type (par exemple,
copy()
).
span
a été implémenté en C++ standard (C++ 11) et est utilisé avec succès dans un outil d'analyse statique commercial pour le code C++ ainsi que dans les logiciels de productivité bureautique commerciaux. Une implémentation de référence open source est disponible à l’adresse suivante: https://github.com/Microsoft/GSL .
Dans un chapitre suivant, ce document présente les accès lecture seule et lecture-écriture ( mutable):
Types d'élément et conversions
span
doit être configuré avec son type d'élément via le paramètre de modèleValueType
, qui doit être un type d'objet complet qui n'est pas un type de classe abstrait.span
prend en charge l'accès en lecture seule ou mutable à la séquence qu'il encapsule. Pour accéder aux données en lecture seule, l'utilisateur peut déclarer unspan<const T>
, Et l'accès aux données mutables utiliserait unspan<T>
.[...]
Voir aussi le Remarques sur la bibliothèque de support: span<T>
de Marius Bancila (mars 2016) définissant span
comme :
Guidelines Support Library est une implémentation Microsoft de certains des types et fonctions décrits dans les Directives C++ Core conservées par le Standard C++ Foundation . Parmi les types fournis par le GSL, il y a
span<T>
, Anciennement appeléarray_view<T>
.
span<T>
Est une plage non propriétaire de mémoire contiguë recommandée pour être utilisée à la place des pointeurs (et compteur de taille) ou des conteneurs standard (tels questd::vector
Oustd::array
).