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 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 回答