In einigen Konferenzvorträgen habe ich Bjarne Stroustrup und andere gehört, die neue Codierungsrichtlinien für C++ und einige Typen, die sie unterstützen, erwähnt haben.
Konkret erinnere ich mich an das Beispiel von span<T>
Anstelle von (T* p, int n)
Als Parameter für eine Funktion (um etwa 32:00 Uhr im Gespräch); Ich erinnere mich aber auch an den Vorschlag, array_view<T>
zu verwenden. Sind das zwei Alternativen, aber dasselbe Konzept? Oder bin ich verwirrend und sie sind eigentlich nicht so verwandt?
Ich kann anscheinend keine verbindliche Definition dessen finden, worum es bei beiden gehen soll.
Wir haben mit Leuten in der Bibliotheksarbeitsgruppe im Normungsausschuss gesprochen. Sie wollten, dass der array_view
, Den sie versuchen, in den Standard zu gelangen, nur gelesen werden kann. Für die Kernrichtlinien benötigten wir eine Abstraktion, die gelesen und geschrieben wurde. Um einen Konflikt zwischen den (potenziellen) Standards und der GSL (Guidelines Support Library) zu vermeiden, haben wir unser array_view
In span
: https: // github umbenannt .com/Microsoft/gsl .
In den CppCoreGuidlines Das ursprüngliche array_view
wurde in span
umbenannt.
Siehe: https://github.com/isocpp/CppCoreGuidelines/pull/377
Es ist so beschrieben:
span ist eine beschränkungsüberprüfte, sichere Alternative zur Verwendung von Zeigern für den Zugriff auf Arrays
Das Dokument P0122R (2016-02-12) von der Library Evolution Working Group (LEWG)
benennt den Typ array_view
offiziell in span
um:
Änderungsprotokoll
Änderungen von R0
- Der Name des vorgeschlagenen Typs wurde von
array_view
Inspan
geändert, nachdem die LEWG auf dem Kona-Treffen eine Rückmeldung gegeben hatte.- [...]
Wir können auch lesen:
Auswirkungen auf den Standard
Dieser Vorschlag ist eine reine Bibliothekserweiterung. Es sind keine Änderungen an Standardklassen, Funktionen oder Kopfzeilen erforderlich. Es würde verbessert, wenn dies vom Typ
byte
und von Änderungen des in P0257 vorgeschlagenen Typ-Aliasing-Verhaltens abhängen könnte.Wenn es jedoch übernommen wird, kann es nützlich sein, einige Standardbibliotheksfunktionen für diesen neuen Typ zu überladen (ein Beispiel wäre
copy()
).
span
wurde in Standard-C++ (C++ 11) implementiert und wird erfolgreich in einem kommerziellen statischen Analysetool für C++ - Code sowie in kommerzieller Office-Produktivitätssoftware verwendet. Eine Open Source-Referenzimplementierung finden Sie unter https://github.com/Microsoft/GSL .
In einem nächsten Kapitel werden in diesem Dokument die Zugriffe read-only und read-write ( mutable) vorgestellt:
Elementtypen und Konvertierungen
span
muss mit seinem Elementtyp über den VorlagenparameterValueType
konfiguriert werden, der ein vollständiger Objekttyp sein muss, der kein abstrakter Klassentyp ist.span
unterstützt entweder den schreibgeschützten oder den veränderlichen Zugriff auf die gekapselte Sequenz. Um auf schreibgeschützte Daten zuzugreifen, kann der Benutzer einenspan<const T>
Deklarieren, und für den Zugriff auf veränderbare Daten würde einspan<T>
Verwendet.[...]
Siehe auch die Guidelines Support Library Review: span<T>
von Marius Bancila (März 2016), die span
definiert als:
Die Guidelines Support Library ist eine Microsoft-Implementierung einiger der in den C++ Core Guidelines beschriebenen Typen und Funktionen, die von der Standard C++ Foundation verwaltet werden. Zu den von der GSL bereitgestellten Typen gehört
span<T>
, Früher bekannt alsarray_view<T>
.
span<T>
Ist ein nicht im Besitz von zusammenhängendem Speicher, der anstelle von Zeigern (und Größenzählern) oder Standardcontainern (wiestd::vector
Oderstd::array
) Verwendet werden sollte.