我可能是个彻头彻尾的白痴,但我刚刚看到了这种 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 可能是某个类的实例,它重载了 operator* 以返回函数指针或函数对象。
这是真的,但我相信迭代器部分涵盖了这种可能性,或者至少迭代器示例给了你足够的提示来自己弄清楚。:-)
希望有帮助。
这似乎x
是一个函数指针。如果确实如此,那么这意味着:
取消引用x
以获得函数类型的表达式;
用参数调用那个函数addressof a
,b
和c
。
另请注意,周围的*
(dereference) 和()
运算符x
是多余的;你可以写
x(&a, b, c);
ifx
也是一个函数指针。
如果不知道符号的定义,就不可能 100% 确定,但我怀疑这是一个函数调用。(假设x
是一个指向函数的指针;如果x
有类类型,它将取决于*
类中一元的重载。)(*x)
取消引用指针也是如此,逻辑上是一个函数;鉴于此,其余的应该是显而易见的。(请注意,正式地,在大多数情况下,函数会衰减为指向函数的指针,并且您通过指向函数的指针进行调用。因此,就编译器而言, ifx
是指向函数的指针(*x)
并且是相同的。不是这样x
然而,人类读者会很高兴被告知该调用是间接的。)
以下是使用operator()
可以产生相同签名的示例。
#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 可能是指向函数的指针,或指向函数的指针。
这很可能是函数指针指向的函数的调用。更传统的语法如下:
x(&a, b, c);
x
指向一个接受三个参数的函数。调用表达式取消引用指针,并将三个参数传递给指针指向的函数。
另一种方法可能x
是指向一个对象的指针,该对象定义了一个三参数运算符的覆盖()
。要知道它是哪一个,您需要提供更多上下文。
它看起来x
要么是指向函数的指针,要么是指向函子的指针。 &a, b, c
是调用的参数列表。
它将参数传递&a, b, c
给指向的函数*x