6

私はおそらく完全なばかですが、このC ++構文を見たばかりで、それが何をしているのかを一生理解することはできません。

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

迅速な回答をいただければ幸いです。

4

9 に答える 9

20

さらに多くの可能性があります。それはすべて、すべてのエンティティのタイプに依存します: xa、。C++ では、カンマ演算子でもオーバーロードできます。bc

しかし、私は だけに焦点を当てx、物事がどうなるか見ていきます。ただし、すべての組み合わせを考慮すると、実際の答えは長くなりすぎます。

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

xのいずれかになります。

  • 関数ポインタ
  • 関数オブジェクトへのポインター。
  • 逆参照時に関数ポインタまたは関数オブジェクトを返す反復子。
  • (前のもので部分的に覆われている下部にもう1つ!)

そして、3 つの引数を渡して呼び出しています。

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がコメントで言ったように:

ただし、4 つ目の可能性があります。x は、関数ポインターまたは関数オブジェクトを返すために operator* をオーバーロードするクラスのインスタンスである可能性があります。

これは本当ですが、この可能性はイテレータによって部分的にカバーされていると思います。または、少なくともイテレータの例は、自分でそれを理解するのに十分なヒントを与えてくれました。:-)

それが役立つことを願っています。

于 2013-01-15T15:55:19.880 に答える
7

x関数ポインタのようです。これが事実である場合、実際、それは次のことを意味します。

  1. x関数型の式を取得するための間接参照。

  2. addressof a引数、、bおよびを使用してその関数を呼び出しますc

*また、 (逆参照)と()その周りの演算子は不要であることに注意してくださいx。あなたは書ける

x(&a, b, c);

x関数ポインタの場合も同様です。

于 2013-01-15T15:54:56.130 に答える
3

シンボルの定義を知らずに 100% 確信することは不可能ですが、関数呼び出しではないかと思います。x(が関数へのポインターであると仮定します。xクラス型を持っている場合は、クラス内の単項のオーバーロードに依存し*ます。)(*x)はポインターを逆参照し、論理的には関数です。これを考えると、残りは明らかなはずです。(正式には、関数はほとんどのコンテキストで関数へのポインターに崩壊し、関数へのポインターを介して呼び出すことに注意してください。したがって、ifxは関数へのポインターであり(*x)xコンパイラーに関する限り同一です。そうではありません。ただし、人間の読者は、呼び出しが間接的であると言われることを歓迎します.)

于 2013-01-15T15:59:10.567 に答える
2

operator()以下は、同一の署名を作成できる whichの使用例です。

#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);

x3 つの引数を取る関数を指します。呼び出し式はポインターを逆参照し、ポインターが指す関数に 3 つの引数を渡します。

x別の方法として、3 引数 operator のオーバーライドを定義するオブジェクトへのポインターを指定することもできます()。それがどれであるかを知るには、より多くのコンテキストを提供する必要があります。

于 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 に答える