强制函数为纯函数 在C++中,可以声明一个函数是const,这意味着,据我理解,编译器确保函数不修改对象。在C++中有类似的东西,我可以要求函数是纯的吗?如果不是C++,有没有语言可以满足这个要求?
如果这是不可能的,为什么可以要求函数为常量而不要求它们为纯函数?这些要求的不同之处是什么 为了清楚起见,我希望除了传递到函数中的变量外,没有副作用,也没有使用其他变量。因此,不应该有文件读取或系统调用等 以下是副作用的更明确定义: 不修改运行程序的计算机上的文件,也不修改作用域超出函数范围的变量。除了传递给函数的变量外,没有其他信息用于计算函数。每次运行该函数时,都应该返回相同的内容 注意:我做了更多的研究,遇到了 (感谢jarod42的评论)强制函数为纯函数 在C++中,可以声明一个函数是const,这意味着,据我理解,编译器确保函数不修改对象。在C++中有类似的东西,我可以要求函数是纯的吗?如果不是C++,有没有语言可以满足这个要求?,c++,C++,如果这是不可能的,为什么可以要求函数为常量而不要求它们为纯函数?这些要求的不同之处是什么 为了清楚起见,我希望除了传递到函数中的变量外,没有副作用,也没有使用其他变量。因此,不应该有文件读取或系统调用等 以下是副作用的更明确定义: 不修改运行程序的计算机上的文件,也不修改作用域超出函数范围的变量。除了传递给函数的变量外,没有其他信息用于计算函数。每次运行该函数时,都应该返回相同的内容 注意:我做了更多的研究,遇到了 (感谢jarod42的评论) 基于对维基百科文章的快速阅读,我觉得你可以要求函数
基于对维基百科文章的快速阅读,我觉得你可以要求函数在纯脚本中是纯的,但是我不能完全确定。
目前,C++没有一种机制来确保一个函数“没有副作用,也不使用除了那些函数中的变量以外的变量”。您只能强制自己编写纯函数,如所述。编译器无法为您检查此项
有一个提议(提议
[[pure]]
)。在这里,您可以看到GCC和Clang已经支持\uuuuuu属性((pure))
。在C++的未来修订中,它可能会以某种形式标准化。 < P>简短回答:没有。没有等价的关键字,叫做“代码>纯< /COD>”,它约束了一个函数,如<代码> const 。
但是,如果您有一个特定的全局变量希望保持不变,那么您可以选择静态类型myVar
。这将要求只有该文件中的函数才能使用它,而该文件之外的任何函数都不能使用它。这意味着该文件之外的任何函数都将被限制为不使用它
至于“副作用”,我会将它们一一分解,以便您知道您有哪些选择:
- 不修改运行程序的计算机上的文件
- 不修改作用域在函数之外的变量
- 除了传递给函数的变量外,没有其他信息用于计算函数李>
- 每次运行该函数时,都应该返回相同的内容李>
const
也不能这样说<代码>常量一直在使用,尤其是在参数列表中。这是为了防止数据在通过引用或其他方式传递时被修改。因此,编译器需要知道哪些函数修改对象。它在函数声明中使用const
,以跟踪这一点。否则,它将无法知道。然而,使用const
,它非常简单。它可以将对象约束为仅使用保证其保持不变的函数,或者在声明中使用const
关键字(如果函数为
因此,const
get需要大量的重用
在C++中,可以声明一个函数是const,这意味着,据我理解,编译器确保函数不修改对象。
不完全是。编译器将允许使用(可能是不明智的)修改对象。因此,编译器只确保函数不会意外修改对象
是什么使这些要求[恒定和纯粹]不同
它们是不同的,因为一个影响正确的功能,而另一个不影响
假设C
是一个容器,您正在迭代它的内容。在循环中的某个点上,可能需要调用一个以C
为参数的函数。如果该函数用于clear()
容器,则循环可能会崩溃。当然,你可以建立一个循环来处理这个问题,但问题是,有时打电话的人需要确保地毯不会从下面被拉出。因此能够标记事物const
。如果将C
作为常量引用传递给函数,则该函数承诺不会修改C
。这个承诺提供了必要的保证(尽管,正如我上面提到的,这个承诺可能会被打破)
我不知道发生了什么情况