通过指针解引用进行函数调用语法

3

考虑以下代码

int add(int a, int b)
{
    return a + b;
}    

int main()
{
    std::cout << (*add)(3, 2);
}

解引用函数指针的意义是什么?

我无法想出这样使用的情况,它似乎没有优势...

C++中为什么存在这种函数调用语法?


3
你发布的代码中,解引用是没有意义的。 - user2100815
@NeilButterworth 是的,但我的问题是一般性的... - ampawd
6
这是有效的C++代码,因为标准允许这样做。然而,这是毫无意义的,因为标准还规定对函数指针进行解引用只会得到函数指针本身。(**add)(3,2) 也是有效的,(***********add)(3,2) 同样有效,它们在功能上是等效的。 - Zinki
2
@Zinki 解除函数指针引用并不会返回函数指针本身,而是返回对函数的引用(然后根据需要反复衰减为函数指针)。 - Daniel H
2个回答

0

这种语法的存在是因为C语言有它,而C++语法最初是基于C语言的。

f(args)(*f)(args)在代码行为上没有区别。


0
我不能确定我是否正确,但这里有一个可能的解释: 在C和C++中,每个函数都是一个潜在的变量。 函数的可能声明如下:
int (*MyFunction)(int, double);

在这种情况下- 变量名: MyFunction | 类型:返回带有 int,double 参数的 int 函数。

因此,即使您声明函数,实际上也声明了具有“函数”类型的变量。 在这种情况下,您可以理解为什么可以使用(* add)(3,2)进行函数调用(或使用变量)。

对于您来说,更清楚的可能是查看lambda表达式,它可以创建一个函数实现,然后让您像本地函数变量一样使用它:

int(*MyFunction)(int, double) = [](int a, double b) -> int {
    return (int)((a + b) * 10);
};

在这里,我们声明了一个函数类型的变量,并使用lambda表达式实现了一个函数。现在我们可以以两种形式使用它:

MyFunction(1, 2.5); // Like a regular function
(*MyFunction)(1, 2.5); // As a function type variable

再次强调,这是我能想到的最合理的解释。我不确定它是否是正确/最佳/完全的解释,但我希望它能给你带来函数方面的新视角。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接