【问题标题】:How they avoid problems with concept-based overloading without explicit models (a.k.a. concept maps)他们如何避免没有显式模型(又名概念图)的基于概念的重载问题
【发布时间】:2015-11-11 02:13:56
【问题描述】:

正如 Andrew Sutton 在许多演讲和论文中指出的那样,Concepts Lite 提案确实具有基于概念的重载功能,同时没有概念图的概念,即根据概念检查模板参数完全由编译器。鉴于此,尚不清楚他们将如何解决 Siek 和 Gregor 在 2005 年的论文“Explicit model definitions are necessary”中描述的问题。简而言之,这个问题可以用论文中的以下引用来说明。

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

(不过除了迭代器之外还有更多示例。)

是的,我知道上面提到的那篇论文考虑了 C++0x 概念,但问题似乎是概念提案的“通用”。

【问题讨论】:

    标签: c++ c++-concepts


    【解决方案1】:

    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 做到了 可以评估所有静态需求 [...] 我们仍然需要区分 一些基于其语义要求的概念。迭代器类别解决了这个问题 对我们来说。

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

    【讨论】:

    • 你的语法是正确的,但有点奇怪,如果你不需要引用它的参数,就不需要 require 表达式。我已经简化了。
    • @ArtemPelenitsyn 似乎不允许; n4377 有template&lt;C T&gt; concept bool V3 = true; // error: constrained template declared as a concept
    • @ArtemPelenitsyn 约束类型说明符和约束参数仍在:void f(C c); template&lt;C T&gt; struct s;
    • @ArtemPelenitsyn 他们从概念定义中删除了缩写语法。由于缩写语法的重点是对被声明的模板应用约束,而概念模板不能被约束,因此是不一致的。
    • “我现在无法访问支持 Concepts 的编译器。”是的你是。 The concepts branch of GCC has been merged to trunk, so Wandbox is a Concepts-enabled compiler with -std=gnu++1z."
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多