rikimaru2013 Asked:2020-01-29 23:51:43 +0000 UTC2020-01-29 23:51:43 +0000 UTC 2020-01-29 23:51:43 +0000 UTC 函数是函子吗 772 函数是函子吗? 函数可以在STL算法中用作函子,但出于某种原因书籍固执地证明函数是函数,函子只是对象 c++ 3 个回答 Voted Best Answer Vlad from Moscow 2020-01-30T00:00:23Z2020-01-30T00:00:23Z C++ 标准中没有函子这样的术语。通常在书籍中,这个概念意味着所谓的函数对象——一个实际上在 C++ 标准中定义的术语。 来自 C++ 标准(20.9 函数对象) 1函数对象类型是一种对象类型(3.9),它可以是函数调用中后缀表达式的类型(5.2.2、13.3.1.1)。230 函数对象是函数对象类型的对象。在人们期望将指向函数的指针传递给算法模板的地方(第 25 条),接口被指定为接受一个函数对象。这不仅使算法模板与指向函数的指针一起工作,而且还使它们能够与任意函数对象一起工作。 因此,书中的作者所说的函子很可能是指函数对象。由于函数不是对象类型,因此不包含在这个概念中。 另一方面,在脚注 230 中写了关于后缀函数调用表达式的类型 230)这样的类型是函数指针或具有成员运算符()的类类型或具有到函数指针的转换的类类型。 但是,算法可以通过引用接受函数,不一定是函数指针。 引用本身可以被模棱两可地解释。我认为其正确解释的关键是引文中的以下短语 在人们期望将指向函数的指针传递给算法模板的地方(第 25 条),接口被指定为接受一个函数对象。 这可能是本书作者在为函数提供运算符的对象和调用前仿函数的简单函数指针之间划清界限的地方。 αλεχολυτ 2020-01-30T00:14:17Z2020-01-30T00:14:17Z 函数和仿函数之间的主要区别在于函数是无状态的,而作为对象的仿函数可以有状态。 当然,我们可以提供一种特殊情况供考虑,即在函数内部定义了一个静态变量,或者使用了一些外部(全局)变量。但是这样的函数不能在两个不同的上下文中使用,因为 条件会一般。使用仿函数(即对象,重载operator())允许您在调用之间共享状态。 此外,仿函数类型可以用作模板参数。不同类型的仿函数将允许您获得不同类型的实例化对象,即使它们的签名operator()相同。如果您有两个具有相同签名的不同函数,例如 , int g(double),int f(double)那么这些函数的类型仍然是相同的int(double)。 Harry 2020-01-29T23:57:26Z2020-01-29T23:57:26Z 是的,很容易。 只是它是一个可调用对象。 函数是否可调用?无疑。一个东西?为什么不?如果不是特定类型的对象,什么是指针? 简而言之,函数是函子的特例,仅此而已。
C++ 标准中没有函子这样的术语。通常在书籍中,这个概念意味着所谓的函数对象——一个实际上在 C++ 标准中定义的术语。
来自 C++ 标准(20.9 函数对象)
因此,书中的作者所说的函子很可能是指函数对象。由于函数不是对象类型,因此不包含在这个概念中。
另一方面,在脚注 230 中写了关于后缀函数调用表达式的类型
但是,算法可以通过引用接受函数,不一定是函数指针。
引用本身可以被模棱两可地解释。我认为其正确解释的关键是引文中的以下短语
这可能是本书作者在为函数提供运算符的对象和调用前仿函数的简单函数指针之间划清界限的地方。
函数和仿函数之间的主要区别在于函数是无状态的,而作为对象的仿函数可以有状态。
当然,我们可以提供一种特殊情况供考虑,即在函数内部定义了一个静态变量,或者使用了一些外部(全局)变量。但是这样的函数不能在两个不同的上下文中使用,因为 条件会一般。使用仿函数(即对象,重载
operator())允许您在调用之间共享状态。此外,仿函数类型可以用作模板参数。不同类型的仿函数将允许您获得不同类型的实例化对象,即使它们的签名
operator()相同。如果您有两个具有相同签名的不同函数,例如 ,int g(double),int f(double)那么这些函数的类型仍然是相同的int(double)。是的,很容易。
只是它是一个可调用对象。
函数是否可调用?无疑。一个东西?为什么不?如果不是特定类型的对象,什么是指针?
简而言之,函数是函子的特例,仅此而已。