C++ 概念和接口之间有什么区别?

What is a difference between a C++ concept and an interface?

我的理解是 C++ library concept is to C++ what interfaces like Closeable 是 Java(根据链接的来源,概念是:命名的要求集)。

  1. 这个比喻正确吗?
  2. C++ 接口(即 class 使用纯虚拟方法)和 C++ 库概念之间有什么区别?
  3. 一般来说,通过多重继承实现 C++ 库概念是否等同于在 Java(没有多重继承)中实现多个接口?
  1. 不对,错了。 Java 中的接口与 C++ 中的接口相同(class,其中每个方法都是纯虚拟的)。

  2. C++ 概念推断 class 功能而不是 C++ 接口定义 class 功能。

  3. C++ 概念与继承无关。概念决定了 class 可以做什么,而不是 class 应该如何实施。

  1. 这不是一个精确的类比,但概念类似于界面。仅具有纯虚成员函数的 class 更接近于 Java 接口。 Java 泛型可能更接近于 C++ 概念,但它们的局限性要大得多。您只能使用它们来要求类型继承特定的基础 class 或接口(我可能是错的)。 Haskell 类型 classes 与 C++ 概念非常接近。

  2. C++ 接口是 class。实现接口就是继承接口并实现纯虚成员函数。一个概念是一组需求。符合一个概念意味着符合class符合所有要求。特定表达式的有效性(必须具有名为 iterator 的成员类型别名)或行为(i++ 必须等同于 It ip=i; ++i; return ip;)可能有要求。

    接口的继承可以而且必须在语言中定义,但是还没有语言支持正式指定概念。已提出语言支持,但未包含在当前 (C++14) 标准中。

    继承是动态(运行时)多态,而概念与模板结合使用,是静态(编译时)多态。

  3. 不等价。动态多态和静态多态是完全不同的东西。