6

我可能是个彻头彻尾的白痴,但我刚刚看到了这种 C++ 语法,但我终其一生都无法弄清楚它在做什么:

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

快速回答将不胜感激。

4

9 回答 9

20

那么还有更多的可能性:这完全取决于所有实体的类型: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* 以返回函数指针或函数对象。

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

希望有帮助。

于 2013-01-15T15:55:19.880 回答
7

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

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

  2. 用参数调用那个函数addressof abc

另请注意,周围的*(dereference) 和()运算符x是多余的;你可以写

x(&a, b, c);

ifx也是一个函数指针。

于 2013-01-15T15:54:56.130 回答
3

如果不知道符号的定义,就不可能 100% 确定,但我怀疑这是一个函数调用。(假设x是一个指向函数的指针;如果x有类类型,它将取决于*类中一元的重载。)(*x)取消引用指针也是如此,逻辑上是一个函数;鉴于此,其余的应该是显而易见的。(请注意,正式地,在大多数情况下,函数会衰减为指向函数的指针,并且您通过指向函数的指针进行调用。因此,就编译器而言, ifx是指向函数的指针(*x)并且是相同的。不是这样x然而,人类读者会很高兴被告知该调用是间接的。)

于 2013-01-15T15:59:10.567 回答
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;
}
于 2013-01-15T16:01:44.557 回答
1

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

于 2013-01-15T15:54:26.177 回答
1

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

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

此参考可能有用:C++ 函数指针教程

于 2013-01-15T15:54:29.973 回答
1

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

x(&a, b, c);

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

另一种方法可能x是指向一个对象的指针,该对象定义了一个三参数运算符的覆盖()。要知道它是哪一个,您需要提供更多上下文。

于 2013-01-15T15:55:04.147 回答
0

它看起来x要么是指向函数的指针,要么是指向函子的指针。 &a, b, c是调用的参数列表。

于 2013-01-15T15:54:52.813 回答
0

它将参数传递&a, b, c给指向的函数*x

于 2013-01-15T15:55:02.893 回答