C ++“概念”和鸭子类型之间有什么关系?

时间:2019-11-06 19:41:43

标签: c++ c++20 duck-typing c++-concepts

这里有一个关于模板和鸭子输入之间关系的更早的问题(8年前!):What's the relationship between C++ template and duck typing?我借用并修改了关于C ++新功能的问题的标语。

在C ++ 20中,将出现“概念”的新功能,它看起来更像是鸭式打字功能。新的C ++“概念”等同于C ++的鸭子类型是否正确?如果没有,那有什么不同?

2 个答案:

答案 0 :(得分:3)

这实际上取决于您如何定义“鸭子类型”。

如果您使用dictionary definition(“如果它走路像鸭子,却像鸭子一样嘎嘎叫,那它一定是鸭子”),然后预先构想templates are a form of duck typing

关于templates are not duck typing本质上是该术语常用方式的论点:被认为使用“鸭子类型”(Python,Lua等)的语言会进行大部分/全部验证,即鸭子实际上是运行时的鸭子。模板在编译时会执行等效的操作,因此它们不代表鸭子类型。

请注意,概念不会影响这两种解释。如果您认为运行时检查是“鸭子类型”性质的基本组成部分,那么即使有概念,模板也不是鸭子类型。

因此,如果您认为模板是鸭子式的概念前概念,那么您可能会感觉类似概念后的感觉。反之亦然。

答案 1 :(得分:3)

  

随着C ++ 20的出现,“概念”的新功能看起来更像是鸭式打字功能

不是真的。

  1. 如果我们接受模板已经在编译时进行鸭子输入

    • 我不同意链接问题和Wikipedia页面上的已接受答案,因为在编译时而不是运行时执行同一件事并不是说服力的理由完全不同的名称。例如,请参见静态与动态多态。

    • 然后概念显然不比模板更像鸭子

    • 这里的另一个论点是,鸭子类型通常假设您通过尝试使用类型来表达类型约束。与模板相比,此模型中的概念更远。

  2. 如果我们(错误地)同意所链接问题的已接受答案以及维基百科,则

    • 模板不是鸭子类型的一个例子是它们在编译时发生

    • 概念也在编译时发生

    • QED

概念采用模板已经所做的事情(可能是鸭子类型,也可能不是,但肯定是鸭子类型),并为专业化提供了更细粒度的选项,和/或更清楚地表达了类型约束,以及(希望)有助于产生更好的错误。

在所有这些操作下,鸭子的质量都是不变的。