いくつかの最近の会議のプレゼンテーションで、Bjarne Stroustrupと他の人がC++とそれらをサポートするいくつかのタイプの新しいコーディングガイドラインについて言及しているのを聞いたことがあります。
具体的には、 関数のパラメーターとしてのspan<T>
の代わりに(T* p, int n)
の例 (32:00頃に話に);しかし、array_view<T>
を使用する提案も覚えています。彼らは2つの選択肢ですが、同じ概念ですか?または、私は物事を混乱させていますが、実際にはそれほど関連していませんか?
私は、両者が何についてのものであるかの正式な定義を見つけることができないようです。
標準化委員会 の ライブラリワーキンググループ の人々と話しました。彼らはarray_view
が標準になって読み取り専用になろうとしていることを望んでいました。コアガイドラインには、読み取りと書き込みの抽象化が必要でした。 (潜在的な)標準とガイドラインサポートライブラリ(GSL)との衝突を避けるために、(読み取りおよび書き込み)array_view
をspan
に名前変更しました: https://github.com/Microsoft/gsl 。
CppCoreGuidlines で、元のarray_view
はspan
に名前が変更されました。
参照: https://github.com/isocpp/CppCoreGuidelines/pull/377
このように記述されています:
spanは、ポインターを使用して配列にアクセスする代わりに、境界チェックされた安全な代替手段です
文書 P0122R (2016-02-12)fromLibrary Evolution Working Group(LEWG)
正式にタイプarray_view
の名前をspan
に変更します。
変更履歴
R0からの変更
- コナ会議でLEWGからのフィードバックを受けて、提案されているタイプの名前を
array_view
からspan
に変更しました。- [...]
また読むことができます:
標準への影響
この提案は純粋なライブラリ拡張です。標準のクラス、関数、またはヘッダーを変更する必要はありません。
byte
タイプと P0257 で提案されているタイプエイリアシング動作の変更に依存する場合は、機能が強化されます。ただし、採用された場合、この新しい型の標準ライブラリ関数をオーバーロードすると便利な場合があります(例は
copy()
)。
span
は標準C++(C++ 11)に実装されており、C++コードおよび商用オフィス生産性ソフトウェアの商用静的解析ツール内で正常に使用されています。オープンソースのリファレンス実装は、 https://github.com/Microsoft/GSL で入手できます。
次の章では、このドキュメントはread-onlyおよびread-write(mutable)アクセス:
要素タイプと変換
span
は、テンプレートパラメータValueType
を介して要素タイプで設定する必要があります。これは、抽象クラスタイプではない完全なオブジェクトタイプである必要があります。span
は、カプセル化されたシーケンスへの読み取り専用アクセスまたは可変アクセスをサポートします。読み取り専用データにアクセスするには、ユーザーはspan<const T>
を宣言でき、可変データへのアクセスにはspan<T>
を使用します。[...]
ガイドラインサポートライブラリレビュー:span<T>
も参照してください。MariusBancila(2016年3月)のspan
の定義:
ガイドラインサポートライブラリ は、- C++コアガイドライン で管理されている C++コアファウンデーション で管理されているいくつかのタイプと機能のMicrosoft実装です。 GSLが提供するタイプには、
span<T>
(以前はarray_view<T>
と呼ばれていたもの)があります。
span<T>
は、ポインター(およびサイズカウンター)または標準コンテナー(std::vector
またはstd::array
など)の代わりに使用することが推奨される連続メモリの非所有範囲です。