为什么功能程序的规律性允许按值传递和按常量引用传递?

Why does the regularity of functional procedures allow passing by value & passing by constant reference?

本文关键字:常量 引用 按值传递 程序 功能 规律性 为什么      更新时间:2023-10-16

在亚历山大·A·斯蒂芬诺夫(Alexander A.

功能过程的规律性允许传递输入的两种技术。当参数的大小很小时,或者如果过程需要副本可以突变,我们会按值传递,制作本地副本。否则,我们通过恒定参考将其传递。

使用本书中的以下定义

当且仅当用平等对象替换其输入时,一个过程是常规的。

让我们假设存在一种对象类型,该对象类型代表单个单词中的布尔值,我们称其为愚蠢。0被解释为假,所有其他状态(1 ... n)被解释为真。

现在,假设存在一个愚蠢的价值的过程,并将其表示为零和一个字符串。

显然不是规律的,因为人们可以通过许多真实值,并且会返回不同的输出对象。但是,我看不出如何通过值或恒定参考将其传递给输入会是有问题的(除了拥有这样的数据类型的事实将不明智地开始!)。

与允许两种技术的其他程序相比,功能程序的规律性是什么?

常规类型的一个属性是:

auto a = b;
assert(a==b);

保持;副本相等。您可能具有不规则类型,没有此属性;例如,==可能会检查身份,并且复制可能创建一个单独的身份。

在常规过程中,我们有一个属性,如果(a==b)f(a)f(b)具有相同的效果。

但是 f( X const& )不做副本,而 f( X ) do 执行副本。因此,如果X类型不规则,则副本不等,则将f( X const& )转换为f( X )可以改变行为。

现在,您不需要完全规律性才能保留,但是此属性是由功能和类型的规律性所暗示的。

我觉得重要的部分是:

功能过程的规律性允许传递输入的两种技术。参数的大小很小,或者如果过程需要副本可能会突变,我们会按值传递,然后制作本地副本。否则,我们通过常量参考将其传递。

这实际上是C 中任何功能的好习惯。

通过值传递对象会在内存中创建一个副本,因此,如果对象很大而您不需要真的不需要需要一个可变的副本,那就是当您通过的时候它通过引用(不会创建副本)。请注意,除非您确实需要可变的参考(您不应该),否则您应该始终更喜欢通过const参考。

该功能是常规的,只能向您保证,当您创建副本时,您将不会更改行为。

另外,您在此描述的功能(使用foolean常规的。规律性并不意味着没有两个输入可以导致相同的输出。f(1) == f(2)并不意味着f不规律,只要f(1)仍然与f(copy(1))相同(有时不是)。