为什么功能程序的规律性允许按值传递和按常量引用传递?
Why does the regularity of functional procedures allow passing by value & passing by constant reference?
在亚历山大·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))
相同(有时不是)。
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?