C++标准将函数对象定义为:
函数对象类型是可以作为后缀表达式出现在函数调用中的对象类型。(链接)
一开始我认为函数对象就是函数符,但后来我意识到对于一个类型为P
(而不是函数,而是函数指针)的函数指针ptr
,std::is_object_v<P>
为true
并且可以使用ptr(Args...)
语法进行调用。
我正确地理解了该标准将函数指针视为函数对象吗?如果不是,哪部分定义未被函数指针满足?
C++标准将函数对象定义为:
函数对象类型是可以作为后缀表达式出现在函数调用中的对象类型。(链接)
一开始我认为函数对象就是函数符,但后来我意识到对于一个类型为P
(而不是函数,而是函数指针)的函数指针ptr
,std::is_object_v<P>
为true
并且可以使用ptr(Args...)
语法进行调用。
我正确地理解了该标准将函数指针视为函数对象吗?如果不是,哪部分定义未被函数指针满足?
是的,它们是。在C++标准中,“对象”一词并不意味着面向对象编程中的“对象”。一个int
就是一个对象。
operator()
来调用成员函数指针,因此它也不是一个函数对象。 - Ben Voigt#include <iostream>
int foo(int a)
{
std::cout << "Hello, " << a << " stars\n";
return a;
}
int (*pr) (int) = foo;
int main()
{
pr(0);
(*pr)(1);
(**pr)(2);
(***pr)(3);
return 0;
}
// also can write `auto pr2 = ...`
int (*pr2) (int) = [](int a)->int {
std::cout << "Hello, lambda " << a << " stars\n"; return a;
};
// in main()
(**pr2)(2);
如果pr是一个泛函,那么这段代码自然是不合法的。
int b = 2;
auto pr3 = [=]()->int {
std::cout << "Hello, general lambda " << b << std::endl;
return b;
};
pr3();
//(*pr3)(); Ill-formed: not a pointer!