强制函数为纯函数

Mat*_*hew 5 c++

在 C++ 中,可以声明一个函数是 const,这意味着,据我所知,编译器确保函数不会修改对象。在 C++ 中是否有类似的东西我可以要求一个函数是纯函数?如果不是在 C++ 中,是否有一种语言可以满足这一要求?

如果这是不可能的,为什么可以要求函数是 const 而不是要求它们是纯的?这些要求有何不同?

为了清楚起见,我希望没有副作用,并且不使用传递给函数的变量以外的变量。因此,不应该有文件读取或系统调用等。

这是副作用的更清晰定义:

不修改运行程序的计算机上的文件,也不修改函数范围外的变量。除了传递给函数的变量之外,没有其他信息用于计算函数。每次运行该函数时,它都应该返回相同的内容。

注意:我做了更多的研究并遇到了纯脚本 (感谢 jarod42 的评论)

基于对维基百科文章的快速阅读,我的印象是您可以要求纯脚本中的函数是纯函数,但我并不完全确定。

小智 1

简短的回答:不。没有等效的关键字 calledpure可以像 does 那样约束函数const

但是,如果您有一个特定的全局变量,并且希望保持不变,则可以选择static type myVar. 这将要求只有该文件中的函数才能使用它,而该文件之外的任何函数都不能使用它。这意味着该文件之外的任何函数都将被迫保留它。

至于“副作用”,我将逐一分解,以便您知道您有哪些选择:

  • 不对运行该程序的计算机上的文件进行修改。

据我所知,您不能限制函数执行此操作。C++ 只是没有提供一种方法来约束这样的函数。但是,如果您愿意,您可以设计一个不修改任何文件的函数。

  • 不能修改作用域在函数之外的变量。

据我所知,除了通过指针或引用作为参数传递的任何变量之外,全局变量是唯一可以在函数范围之外修改的变量。全局变量可以选择是常量或静态,这将使您无法修改它们,但是除此之外,据我所知,您实际上无能为力。

  • 除了传递给函数的变量之外,不使用任何信息来计算函数。

再说一次,你不能强迫它这样做,让我知道。但是,如果您愿意,您可以将函数设计为像这样工作。

  • 每次运行该函数时都应返回相同的内容。

我不确定我明白为什么你想限制这样的函数,但不。我不知道。再说一次,如果你愿意的话,你可以这样设计。

至于为什么C++不提供这样的选项?我猜可重用性。看来您有一个不希望函数执行的特定操作列表。然而,许多其他 C++ 用户作为一个整体需要这组特定约束的可能性通常很小。也许他们一次需要一两个,但不是一次全部需要。看来不值得这么麻烦地添加它。

然而,对于 却不能说同样的话constconst一直使用,尤其是在参数列表中。这是为了防止数据通过引用或其他方式传递时被修改。因此,编译器需要知道哪些函数修改了对象。它const在函数声明中使用来跟踪这一点。否则,它无从得知。然而,通过使用const,它非常简单。它可以限制对象仅使用保证其保持不变的函数,或者const在函数声明中使用关键字。

因此,const得到了大量的重用。