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

强制函数为纯函数 在C++中,可以声明一个函数是const,这意味着,据我理解,编译器确保函数不修改对象。在C++中有类似的东西,我可以要求函数是纯的吗?如果不是C++,有没有语言可以满足这个要求?,c++,C++,如果这是不可能的,为什么可以要求函数为常量而不要求它们为纯函数?这些要求的不同之处是什么 为了清楚起见,我希望除了传递到函数中的变量外,没有副作用,也没有使用其他变量。因此,不应该有文件读取或系统调用等 以下是副作用的更明确定义: 不修改运行程序的计算机上的文件,也不修改作用域超出函数范围的变量。除了传递给函数的变量外,没有其他信息用于计算函数。每次运行该函数时,都应该返回相同的内容 注意:我做了更多的研究,遇到了 (感谢jarod42的评论) 基于对维基百科文章的快速阅读,我觉得你可以要求函数

如果这是不可能的,为什么可以要求函数为常量而不要求它们为纯函数?这些要求的不同之处是什么

为了清楚起见,我希望除了传递到函数中的变量外,没有副作用,也没有使用其他变量。因此,不应该有文件读取或系统调用等

以下是副作用的更明确定义:

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

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


基于对维基百科文章的快速阅读,我觉得你可以要求函数在纯脚本中是纯的,但是我不能完全确定。

目前,C++没有一种机制来确保一个函数“没有副作用,也不使用除了那些函数中的变量以外的变量”。您只能强制自己编写纯函数,如所述。编译器无法为您检查此项


有一个提议(提议
[[pure]]
)。在这里,您可以看到GCC和Clang已经支持
\uuuuuu属性((pure))
。在C++的未来修订中,它可能会以某种形式标准化。

< P>简短回答:没有。没有等价的关键字,叫做“代码>纯< /COD>”,它约束了一个函数,如<代码> const 。 但是,如果您有一个特定的全局变量希望保持不变,那么您可以选择
静态类型myVar
。这将要求只有该文件中的函数才能使用它,而该文件之外的任何函数都不能使用它。这意味着该文件之外的任何函数都将被限制为不使用它

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

  • 不修改运行程序的计算机上的文件
我知道,你不能约束一个函数去做这件事。C++只是不提供一种约束这样的函数的方法。但是,如果愿意,可以设计一个不修改任何文件的函数

  • 不修改作用域在函数之外的变量
我知道,除了作为参数通过指针或引用传递的任何内容外,全局变量是唯一可以在函数范围外修改的变量。全局变量可以选择为常量或静态,这将阻止您修改它们,但是,除此之外,我知道您真的无能为力

  • 除了传递给函数的变量外,没有其他信息用于计算函数
再一次,你不能限制它这样做,我知道。但是,如果需要,可以将函数设计为这样工作

  • 每次运行该函数时,都应该返回相同的内容
我不确定我是否理解为什么要约束这样的函数,但我不知道。不过,如果您愿意,也可以这样设计

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

然而,
const
也不能这样说<代码>常量一直在使用,尤其是在参数列表中。这是为了防止数据在通过引用或其他方式传递时被修改。因此,编译器需要知道哪些函数修改对象。它在函数声明中使用
const
,以跟踪这一点。否则,它将无法知道。然而,使用
const
,它非常简单。它可以将对象约束为仅使用保证其保持不变的函数,或者在声明中使用
const
关键字(如果函数为

因此,
const
get需要大量的重用

在C++中,可以声明一个函数是const,这意味着,据我理解,编译器确保函数不修改对象。 不完全是。编译器将允许使用(可能是不明智的)修改对象。因此,编译器只确保函数不会意外修改对象

是什么使这些要求[恒定和纯粹]不同

它们是不同的,因为一个影响正确的功能,而另一个不影响

假设
C
是一个容器,您正在迭代它的内容。在循环中的某个点上,可能需要调用一个以
C
为参数的函数。如果该函数用于
clear()
容器,则循环可能会崩溃。当然,你可以建立一个循环来处理这个问题,但问题是,有时打电话的人需要确保地毯不会从下面被拉出。因此能够标记事物
const
。如果将
C
作为常量引用传递给函数,则该函数承诺不会修改
C
。这个承诺提供了必要的保证(尽管,正如我上面提到的,这个承诺可能会被打破)

我不知道发生了什么情况