web-dev-qa-db-ja.com

新しいイテレーター要件

すべてのコンテナではないにしても、ほとんどのコンテナに::iteratorを入力して、LegacySomethingIteratorの代わりにSomethingIteratorを満たします。

例えば、 std::vector<>::iterator現在必要

iteratorLegacyRandomAccessIterator

これは他のほとんどのコンテナでも同じようで、すべてのイテレータはSomethingIteratorからLegacySomethingIteratorに移動する必要があります。

RandomAccessIterator など、古い要件の名前をとった「新しい」要件もありますが、なぜこれらが追加されたのですか?新しい亜種は、従来の亜種をシャドウするだけで、違いはないようです。

なぜ新しいものが最初に作成されたのか、それらの要件は私にとって同じように見えます。なぜ新しい要件は、現在2つの異なる名前(たとえば、RandomAccessIteratorLegacyRandomAccessIterator)を持っているのではなく、古い要件を単に置き換えないのですか?

32

これらは新しいものではないため、「レガシー」という用語です。これは、cppreferenceサイトが、C++ 20が「RandomAccessIterator」と呼ばれる「概念」である2つの異なるものを持っているという事実を調整するために選択する方法です。

C++ 20より前の「概念」は、特定のテンプレートパラメータに期待される動作を表す標準の要件のセットにすぎませんでした。 C++ 20では、概念が実際の言語機能になり、それを変える必要がありました。問題は、「concept」の範囲RandomAccessIterator同じではないであり、「RandomAccessIterator」の古いスタイルの「概念」と同じであるということです。

C++はこれらを両方とも「概念」と見なしているため(言語の意味では新しい方だけがconceptですが)、Wikiでは同じページ名になります。そしてMediaWikiはそれを実際に許可していません。

そのため、サイトのメンテナーは「レガシー」を使用してそれらを区別することに決めました。実際の標準はこの「レガシー」プレフィックスを使用しないことに注意してください。

C++ 20標準には、古い概念の接頭辞「Cpp17」があることに注意してください。したがって、古いコンセプトは「Cpp17RandomAccessIterator」になります。それは明らかな理由でCppreferenceに適切とは見なされませんでした。

26
Nicol Bolas