c++语法应该如何阅读?
How should this C++ syntax be read?
我可能是个十足的白痴,但我刚刚看到了这个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
调用该函数
还要注意,x
周围的*
(解引用)和()
操作符是多余的;你可以写
x(&a, b, c);
如果x
是一个函数指针
如果不知道符号的定义,就不可能100%确定,但我怀疑这是一个函数调用。(假设x
是一个指向函数的指针;如果x
具有类类型,则依赖于该类中一元*
的重载。所以(*x)
是对指针解引用,逻辑上是一个函数;考虑到这一点,其余的应该是显而易见的。(请注意,在形式上,函数在大多数上下文中都会衰变成指向函数的指针,您可以通过指向函数的指针进行调用。因此,如果x
是指向函数的指针,那么(*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'所指向的函数。
这个参考可能有用:c++函数指针教程
这很可能是对函数指针所指向的函数的调用。更常规的语法如下:
x(&a, b, c);
x
指向一个接受三个实参的函数。调用表达式解引用指针,并将三个实参传递给指针指向的函数。
另一种可能是,x
是指向对象的指针,该对象定义了对三参数操作符()
的重写。要知道是哪一个,你需要提供更多的上下文
看起来x
要么是一个指针到指针到函数,要么是一个指针到函子。&a, b, c
是调用的参数列表
将参数&a, b, c
传递给*x
指向的函数
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- 循环后如何继续阅读
- QMetaObject invokeMethod的基于函数指针的语法
- 用c++阅读音频
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- Python中的for循环与C++有何不同
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 如何从QFile阅读?它显示该文件不可访问
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 有没有办法使用 c++ 实时阅读文本?
- c++语法应该如何阅读?