我可能很蠢,但是我刚刚看到了这个C++语法,却完全弄不清它在做什么:
(*x)(&a, b, c);
希望能尽快得到答复。
我可能很蠢,但是我刚刚看到了这个C++语法,却完全弄不清它在做什么:
(*x)(&a, b, c);
希望能尽快得到答复。
这里有许多可能性:一切取决于所有实体的类型:x
,a
,b
,c
。在C++中,您甚至可以重载逗号运算符。
但我只会关注 x
,看看事情如何发展。然而,如果考虑所有组合,实际答案将会太长。
(*x)(&a, b, c);
这里的x
可以是以下之一:
然后您会传递三个参数来调用它。
以下是一些示例,假设所有其他实体(a
,b
,c
)均为int
:
一个假设
int a,b,c; //FIXED as per the assumption
函数指针
void f(int *,int, int);
auto *x = f;
(*x)(&a,b,c); //x is function pointer
x(&a,b,c); //works fine, even without (*x)
函数对象
struct X { void operator()(int*,int,int); };
X y, *x = &y;
(*x)(&a,b,c); //x is pointer to function object
迭代器
std::list<std::function<void(int*,int,int)> l {X(), f};
auto x = l.begin(); //x is an iterator
(*x)(&a,b,c); //(*x) is function object
++x;
(*x)(&a,b,c); //(*x) is function object (still!)
//OR
std::list<void(int*,int,int)> l {f};
auto x = l.begin(); //x is an iterator
(*x)(&a,b,c); //(*x) is function pointer!
正如 @David 在评论中所说:
然而,还有第四种可能性:x 可能是某个类的实例,该类重载运算符*以返回函数指针或函数对象。
这是正确的,但我认为这种可能性部分地被迭代器所涵盖,或者至少迭代器的示例给了你足够的提示,让你自己找出答案。:-)
希望这可以帮到你。
x
具有类类型,并且具有重载的一元 *
运算符,则可能存在更多可能性。更不用说如果 b
具有用户定义类型,并且有逗号运算符的重载。通过巧妙地使用重载,这些可能性就无穷无尽了。 - James Kanzex
可能是某个类的实例,该类重载了operator*
以返回函数指针或函数对象。 - David Hammenx
是一个函数指针。如果是这种情况,那么这意味着:
解引用x
以获得函数类型的表达式;
使用参数addressof a
、b
和c
调用该函数。
*
(解引用)和()
运算符在x
周围是多余的;你可以写成x(&a, b, c);
如果x
是函数指针,同样适用。
x
的()
和*
是让我感到困惑的原因,特别是如果它们不是必需的,就像你所说的那样。这是一个函数指针。谢谢。 - Ed Kingx
是一个函数指针,但它也可能是一个指向函数对象的指针(在这种情况下,括号和 *
都不是多余的)。但我没有踩。 - David Rodríguez - dribeasx
是一个函数指针。另外,还有一个条件语句说“如果x
是一个函数指针”,所以这应该没问题(如果我在逻辑上没有失败的话:P) - user529758operator()
的示例,它可以产生相同的签名。#include <iostream>
using namespace std;
struct sample {
void operator()(int* a, int b, int c) {
*a = b = c;
return;
}
};
int main() {
sample* x;
int a = 1, b = 1, c = 1;
(*x)(&a, b, c);
return 0;
}
x(&a, b, c);
x
指向一个接受三个参数的函数。调用表达式对指针进行解引用,并将三个参数传递给指针所指向的函数。
另一种可能是x
是一个指向对象的指针,该对象定义了一个三参数运算符()
的重载。要知道它是哪一个,需要提供更多的上下文。
()
运算符将其参数视为函数。 C遵循了这一做法,但它是一个相当少用的特性,至少在我看到的C中是如此。 在C中,指向函数的指针很少见,好的程序员认为使用显式语法来引起注意间接调用的事实非常重要。 在C ++中,您不需要显式解引用的事实是出于与C兼容的原因,但是再次强调,好的C ++程序员不使用它(除了在模板中偶然使用)。 - James Kanzex 可能是指向函数的指针,或者指向函数指针的指针。
看起来x
是一个指向函数指针的指针,或者是一个指向仿函数的指针。&a、b、c
是函数调用的参数列表。
它将参数 &a, b, c
传递给一个由 *x
指向的函数