如何在没有显式模型的情况下避免基于概念的重载问题(也就是概念图)

Art*_*syn 6 c++ c++-concepts

正如Andrew Sutton在一些会谈和论文中指出的那样,Concepts Lite提案确实具有基于概念的重载功能,同时没有概念图的概念,即模板参数完全由概念检查.编译器.鉴于此,目前尚不清楚他们如何解决Siek和Gregor在2005年论文中描述的问题," 明确的模型定义是必要的 ".简而言之,问题可以通过以下文章引用来说明.

因此,某些输入迭代器类型(例如istream_iterator)会被错误分类为前向迭代器.这有什么危险?一些算法基于Input_iterator与Forward_iterator进行调度.

(除了迭代器之外还有更多的例子.)

是的,我知道上面提到的论文考虑了C++ 0x概念,但问题似乎是概念提议的"通用".

eca*_*mur 3

n3351 A Concept Design for the STL中的建议是继续使用迭代器类别标签:

concept InputIterator<WeakInputIterator I> =
    EqualityComparable<I> &&
    Derived<IteratorCategory<I>, input_iterator_tag>;
Run Code Online (Sandbox Code Playgroud)

在预计包含在n4377 C++ 概念扩展标准中的语法中:

template<typename I>
concept bool InputIterator =
    WeakInputIterator<I>() && EqualityComparable<I>() &&
    Derived<IteratorCategory<I>, input_iterator_tag>();
Run Code Online (Sandbox Code Playgroud)

来自前一篇论文:

虽然 C++11 可以评估所有静态需求 [...],但我们仍然需要根据语义需求区分一些概念。迭代器类别为我们解决了这个问题。

一般来说,可以通过检查类型谓词(例如,嵌套类型或常量,或类型函数)来表达语义要求,该类型谓词仅出于断言运行时语义的目的而存在。