6

Andrew Sutton による多くの講演や論文で指摘されているように、Concepts Lite 提案には概念ベースのオーバーロード機能があり、同時に概念マップの概念がありません。つまり、テンプレートの引数は概念に対して完全にチェックされますコンパイラ。これを考えると、Siek と Gregor による 2005 年の論文「<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005 /n1798.html" rel="nofollow">明示的なモデル定義が必要です". 要するに、この問題は論文からの次の引用で述べることができます。

そのため、特定の入力反復子の型 (istream_iterator など) は前方反復子として誤分類されます。これには何が危険ですか?一部のアルゴリズムは、Input_iterator と Forward_iterator に基づいてディスパッチします。

(ただし、イテレータ以外にも例があります。)

はい、上記の論文が C++0x の概念を考慮していることは承知していますが、問題は概念の提案よりも「一般的」であるようです。

4

1 に答える 1

3

n3351 A Concept Design for the STLの提案は、イテレータ カテゴリ タグを引き続き使用することです。

concept InputIterator<WeakInputIterator I> =
    EqualityComparable<I> &&
    Derived<IteratorCategory<I>, input_iterator_tag>;

n4377 C++ Extensions for Conceptsごとに標準に含めることが期待される構文:

template<typename I>
concept bool InputIterator =
    WeakInputIterator<I>() && EqualityComparable<I>() &&
    Derived<IteratorCategory<I>, input_iterator_tag>();

以前の論文から:

C++11 はすべての静的要件を評価できるようにしますが [...] セマンティック要件に基づいていくつかの概念を区別する必要があります。イテレータ カテゴリは、この問題を解決してくれます。

一般に、ランタイム セマンティックをアサートするためだけに存在する型述語 (ネストされた型や定数、または型関数など) をチェックすることによって、セマンティック要件を表現できます。

于 2015-08-18T08:50:29.417 に答える