c++语法应该如何阅读?

How should this C++ syntax be read?

本文关键字:何阅读 语法 c++      更新时间:2023-10-16

我可能是个十足的白痴,但我刚刚看到了这个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是一个函数指针。如果确实是这样,那么它的意思是:

  1. x解引用,得到函数类型表达式;

  2. 使用参数addressof a, bc调用该函数

还要注意,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指向的函数