如何读取这个C ++语法?

时间:2013-01-15 15:53:21

标签: c++ syntax

我可能是一个完全白痴,但我刚看到这个C ++语法,我不能为我的生活弄清楚它在做什么:

(*x)(&a, b, c);

非常感谢快速回答。

9 个答案:

答案 0 :(得分:20)

那么可能会有更多的可能性:它取决于所有实体的类型:xabc。在C ++中,您甚至可以重载逗号运算符。

但我只关注x,看看情况如何。但是,如果考虑所有组合,实际答案将会太长。

(*x)(&a, b, c);

此处x可以是其中之一:

  • 函数指针
  • 指向功能对象的指针。
  • 解除引用时返回函数指针或函数对象的迭代器。
  • (在底部还有一个部分由前一部分覆盖!)

然后你调用它传递三个参数。

以下是一些示例,假设所有其他实体(ab 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 *以返回函数指针或函数对象。

这是真的,但我相信这种可能性是由迭代器覆盖部分,或者至少迭代器示例给了你足够的提示来自己解决它。 :-)

希望有所帮助。

答案 1 :(得分:7)

x似乎是一个函数指针。如果确实如此,则意味着:

  1. 取消引用x以获取函数类型的表达式;

  2. 使用参数addressof abc调用该函数。

  3. 另请注意,*周围的()(取消引用)和x运算符是多余的;你可以写

    x(&a, b, c);
    

    如果x是函数指针。

答案 2 :(得分:3)

在不知道符号的定义的情况下,不可能100%确定,但我怀疑它是一个函数调用。 (假设x是指向函数的指针;如果x具有类类型,则它将取决于类中一元*的重载。)因此(*x)是解除引用指针,逻辑上是一个函数;鉴于此,其余的应该是显而易见的。 (注意,正式地,函数在大多数上下文中衰减为指向函数的指针,并且通过指向函数的指针调用。因此,如果x是指向函数(*x)和{{1的指针就编译器而言,它们是完全相同的。然而,不是那么人类的读者,并且大多数人会欣赏被称为间接的呼叫。)

答案 3 :(得分:2)

以下是使用可生成相同签名的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;
}

答案 4 :(得分:1)

x可能是指向函数的指针,或指向函数指针的指针。

答案 5 :(得分:1)

它通过函数指针调用函数。

使用提供的参数调用指针'x'指向的函数。

此参考可能有用:C++ Function pointer tutorial

答案 6 :(得分:1)

这很可能是对函数指针指向的函数的调用。更常规的语法如下:

x(&a, b, c);

x指向一个带三个参数的函数。调用表达式取消引用指针,并将三个参数传递给指针指向的函数。

另一种选择可能是x是指向对象的指针,该对象定义了三参数运算符()的覆盖。要知道你需要哪一个提供更多的背景。

答案 7 :(得分:0)

看起来x是一个指向函数的指针,或一个指向仿函数的指针。 &a, b, c是呼叫的参数列表。

答案 8 :(得分:0)

它将参数&a, b, c传递给*x

指向的函数